在 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的使用