【问题标题】:Update model fields based on POST data before save with Django Rest Framework在使用 Django Rest Framework 保存之前根据 POST 数据更新模型字段
【发布时间】:2018-07-07 07:54:11
【问题描述】:

我正在使用 django-rest-framework 并希望在将发布的数据保存到我的模型之前对其进行扩充,这通常使用模型的 clean 方法实现,如 django 文档中的此示例所示:

class Article(models.Model):
...
def clean(self):
    # Don't allow draft entries to have a pub_date.
    if self.status == 'draft' and self.pub_date is not None:
        raise ValidationError(_('Draft entries may not have a publication date.'))
    # Set the pub_date for published items if it hasn't been set already.
    if self.status == 'published' and self.pub_date is None:
        self.pub_date = datetime.date.today()

不幸的是,django-rest-framework Serializer 不像标准 django Form 那样调用模型的 clean 方法,那么我该如何实现呢?

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    来自官方docs

    您需要注意的一个区别是 .clean() 方法不会被调用作为序列化程序验证的一部分,就像使用 ModelForm 时那样。使用序列化程序 .validate() 方法在需要时对传入数据执行最终验证步骤。

    在某些情况下,您确实需要在模型 .clean() 方法中保留验证逻辑,而不能将其分离到序列化器 .validate() 中。您可以通过在 .validate() 方法中显式实例化模型实例来实现。

    def validate(self, attrs):
        instance = ExampleModel(**attrs)
        instance.clean()
        return attrs
    

    【讨论】:

      猜你喜欢
      • 2012-10-25
      • 2019-05-18
      • 2015-01-17
      • 2016-11-05
      • 1970-01-01
      • 1970-01-01
      • 2016-11-13
      • 2015-09-19
      • 2014-05-23
      相关资源
      最近更新 更多