在Django 1.7中序列化类方法

jez*_*jez 5 python django django-models class-method django-migrations

当我尝试manage.py makemigrations在Django 1.7 上运行时,我收到以下错误:

ValueError: Cannot serialize: <bound method ModelBase.get_default of <class 'printapp.models.JobConfiguration'>>
There are some values Django cannot serialize into migration files.
For more, see https://docs.djangoproject.com/en/dev/topics/migrations/#migration-serializing
Run Code Online (Sandbox Code Playgroud)

所以看起来get_default定义的方法存在问题JobConfiguration,其定义在下面重复:

@classmethod
def get_default(cls):
    result = cls()
    result.save()
    return result
Run Code Online (Sandbox Code Playgroud)

按照错误消息中提供链接,看起来序列化"类引用"是一个受支持的功能.

是一个"类引用"一样@classmethod吗?

如何在"模块的顶级范围"中添加"类引用"?

为什么必须通过迁移跟踪方法?我假设迁移是针对数据库模式的,它只跟踪存储的数据类型,而不是类所使用的方法类型.

值得注意的是:将get_default下面重复的静态方法的定义更改为解决问题,但代价是必须对JobConfiguration类名进行硬编码.

@staticmethod
def get_default():
    result = JobConfiguration()
    result.save()
    return result
Run Code Online (Sandbox Code Playgroud)

(某些上下文:此方法是JobConfiguration.get_default从a中引用的models.OneToOneField(JobConfiguration, default=JobConfiguration.get_default),其效果是为每个创建的字段创建新的JobConfiguration.)

Avi*_*aor 0

迁移只是包含模型旧定义的 Python 文件 - 因此,为了编写它们,Django 必须获取模型的当前状态并将它们序列化到文件中。

classmethod 绑定到类。由于装饰器包装了方法,因此序列化器面临着绑定什么的模糊性:包装器还是方法,并且它失败了。使用静态方法就不存在这样的问题,因为它是附加到类的简单函数。