5

当我尝试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

get_default因此,在 上定义的方法似乎存在问题JobConfiguration,其定义在下面重复:

@classmethod
def get_default(cls):
    result = cls()
    result.save()
    return result

按照错误消息中提供的链接,序列化“类引用”似乎是受支持的功能。

“类引用”是否与 a 相同@classmethod

我如何将“类引用”放在“模块的顶级范围”中?

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

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

@staticmethod
def get_default():
    result = JobConfiguration()
    result.save()
    return result

JobConfiguration.get_default(一些上下文:这个方法在 a中被引用,models.OneToOneField(JobConfiguration, default=JobConfiguration.get_default)效果是为每个创建的这些字段创建一个新的 JobConfiguration。)

4

1 回答 1

0

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

classmethod 绑定到类。由于装饰器包装了方法,序列化器面临一个不确定的问题:要绑定什么:包装器或方法,它会失败。使用静态方法没有这样的问题,因为它是一个附加到类的简单函数。

于 2016-02-15T20:10:43.743 回答