【发布时间】:2014-11-14 19:07:58
【问题描述】:
当我尝试在 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 之后,似乎序列化“类引用”是一个受支持的功能。
“类引用”是否与@classmethod 相同?
如何将“类引用”放在“模块的顶级范围”中?
为什么必须通过迁移来跟踪方法?我假设迁移是针对数据库模式的,它只跟踪存储的数据类型,而不是类使用的方法类型.
值得注意的是:将get_default 的定义更改为静态方法(如下所述)可以解决问题,但代价是必须对JobConfiguration 类名进行硬编码。
@staticmethod
def get_default():
result = JobConfiguration()
result.save()
return result
(某些上下文:此方法在 models.OneToOneField(JobConfiguration, default=JobConfiguration.get_default) 中被引用为 JobConfiguration.get_default,其效果是为创建的每个字段创建一个新的 JobConfiguration。)
【问题讨论】:
-
只是出于兴趣,这对
JobConfiguration.objects.create()有什么好处?它仍然是一个命令,几乎没有更多的输入。 -
呃,我没有意识到这个方法是可用的。我可能会在我的代码中更改它,但我仍然想知道为什么代码会按原样失败。
标签: python django django-models class-method django-migrations