当我尝试在Django 1.7上运行manage.py makemigrations
时,我收到以下错误:
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
因此,get_default
上定义的方法JobConfiguration
存在问题,其定义在下面重复:
@classmethod
def get_default(cls):
result = cls()
result.save()
return result
在link that was provided in the error message之后,它看起来像序列化&#34;类引用&#34;是一个受支持的功能。
是&#34;类引用&#34;与@classmethod
相同?
我如何设置&#34;类引用&#34;在&#34;模块的顶级范围&#34;?
为什么必须通过迁移跟踪方法?我假设迁移是针对数据库模式的,它只跟踪存储的数据类型,而不是类所使用的方法类型
值得注意的是:将get_default
的定义更改为静态方法,如下所示,可以解决问题,但代价是必须对JobConfiguration
类名进行硬编码。
@staticmethod
def get_default():
result = JobConfiguration()
result.save()
return result
(某些上下文:此方法在JobConfiguration.get_default
内被引用为models.OneToOneField(JobConfiguration, default=JobConfiguration.get_default)
,其效果是为每个创建的字段创建新的JobConfiguration。)
答案 0 :(得分:0)
迁移只是包含旧定义的Python文件 你的模型 - 因此,要编写它们,Django必须采用当前状态 您的模型并将它们序列化为文件。
classmethod绑定到类。由于装饰器包装了该方法,因此序列化程序面临着一个含糊不清的内容:包装器或方法,它会失败。使用静态方法没有这样的问题,因为它是附加到类的简单函数。