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.)
迁移只是包含模型旧定义的 Python 文件 - 因此,为了编写它们,Django 必须获取模型的当前状态并将它们序列化到文件中。
classmethod 绑定到类。由于装饰器包装了方法,因此序列化器面临着绑定什么的模糊性:包装器还是方法,并且它失败了。使用静态方法就不存在这样的问题,因为它是附加到类的简单函数。