在Django 1.7中序列化类方法

时间:2014-09-20 08:00:06

标签: python django django-models class-method django-migrations

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

1 个答案:

答案 0 :(得分:0)

  

迁移只是包含旧定义的Python文件   你的模型 - 因此,要编写它们,Django必须采用当前状态   您的模型并将它们序列化为文件。

classmethod绑定到类。由于装饰器包装了该方法,因此序列化程序面临着一个含糊不清的内容:包装器或方法,它会失败。使用静态方法没有这样的问题,因为它是附加到类的简单函数。