我有一个wiki模型,它有两个字段如下。
class Wiki(models.Model):
markup = models.TextField()
rendered = models.TextField()
和相应的序列化程序,其中restore_object应该自动填充渲染字段。
class WikiSerializer(ModelSerializer):
def restore_object(self, attrs, instance=None):
awiki = super(WikiSerializer, self).restore_object(attrs, instance)
awiki.rendered = markdown(awiki.markup)
return awiki
class Meta:
model = Wiki
@ shell,
$ awiki = WikiSerializer(data = {'markup' : '#hello world'})
$ awiki.errors
=> {'rendered': 'This field is required'}
显然没有执行restore_object方法。 restore_object不是用于从给定数据创建模型对象吗?
答案 0 :(得分:1)
restore_object
因缺少rendered
字段而失败。尝试使用exclude
or fields
或指定模型字段rendered
以blank=True
:
注意:当验证应用于ModelSerializer时,两者都是 序列化程序字段及其相应的模型字段必须正确 验证。如果您的模型上有可选字段,请确保 在模型字段上正确设置blank = True,以及设置 序列化器字段上的required = False。
此外,class META
应为class Meta
。与request.META
不同,Django模型和DRF序列化程序使用Meta
。
答案 1 :(得分:0)
@okm感谢您通知restore_objct runs after validation
。
我通过只读rendered
字段来解决问题。我需要序列化数据中的rendered
字段,因此我无法排除它。
class WikiSerializer(ModelSerializer):
def restore_object(self, attrs, instance=None):
awiki = super(WikiSerializer, self).restore_object(attrs, instance)
awiki.rendered = markdown(awiki.markup)
return awiki
class Meta:
model = Wiki
read_only_fields = ('rendered',)