ModelSerializer中的DRF restore_object()不会执行

时间:2014-11-20 06:59:47

标签: django django-rest-framework

我有一个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不是用于从给定数据创建模型对象吗?

2 个答案:

答案 0 :(得分:1)

验证后运行

restore_object因缺少rendered字段而失败。尝试使用exclude or fields或指定模型字段renderedblank=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',)