在 Django 1.7 中序列化类方法

Posted

技术标签:

【中文标题】在 Django 1.7 中序列化类方法【英文标题】:Serializing classmethods in Django 1.7 【发布时间】: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() 有什么好处?它仍然是一个命令,几乎没有更多的输入。 呃,我没有意识到这个方法是可用的。我可能会在我的代码中更改它,但我仍然想知道为什么代码会按原样失败。 【参考方案1】:

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

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

【讨论】:

以上是关于在 Django 1.7 中序列化类方法的主要内容,如果未能解决你的问题,请参考以下文章

升级到 Django 1.7。出现错误:无法序列化:<storages.backends.s3boto.S3BotoStorage 对象

django-rest-framework-从零开始-3-序列化类ModelSerializer的使用

django的几种方法进行序列化(视图)

在 django 中序列化非模型类

Django Rest Framework-----序列化详解(serializers)

Django rest框架嵌套序列化程序创建方法