Django:在模型 save() 方法中返回序列化程序 ValidationError

Posted

技术标签:

【中文标题】Django:在模型 save() 方法中返回序列化程序 ValidationError【英文标题】:Django: Return serializer ValidationError in Model save() method 【发布时间】:2019-06-01 07:54:21 【问题描述】:

我使用 django-rest-framework 在 Django 框架中创建 Rest API。除了序列化方法之外,还可以返回任何validationError

但是,我想知道是否可以从 django modelsave() 方法返回错误,这些错误会被转换为 django rest validationError

例如,假设我想限制在特定表上创建对象。像这样:

class CustomTable(models.Model):
    ... # modles fields go here

    def save():
        if CustomTable.objects.count() > 2:
             # Return a validationError in any serializer that is connected to this model.

注意我可以使用raise ValueErrorraise ValidationError,但它们都会在端点上导致 500 错误。但我想在我的 api 视图中返回一个响应,例如“达到限制”

【问题讨论】:

【参考方案1】:

DRF ValidationError 在序列化程序中处理,因此您应该在调用模型的保存方法时捕获任何预期错误并使用它来引发 ValiddationError

例如,您可以在序列化程序的保存方法中执行此操作:

def save(self, **kwargs):
    try:
        super().save(**kwargs)
    except ModelError as e:
        raise serializers.ValidationError(e)

ModelError 是您在模型中提出的错误

【讨论】:

【参考方案2】:

有两到三种方法可以做到这一点

1.使用clean方法。

class CustomTable(models.Model):
    ... # modles fields go here

    def clean(self):
     if CustomTable.objects.count() > 2:
                raise ValidationError(_('custom table can not have more than two entries.'))

    使用Signals。

    @receiver(pre_save, sender= CustomTable)
    def limit(sender, **kwargs):
          if CustomTable.objects.count() > 2:
                raise ValidationError(_('Custom table can not have more than two entries.'))
    

【讨论】:

信号总是更好。因为它处理在 Django admin 中创建的对象。

以上是关于Django:在模型 save() 方法中返回序列化程序 ValidationError的主要内容,如果未能解决你的问题,请参考以下文章

Django,调用 super() 后如何在 save() 方法中更新模型?

在 django 模型自定义 save() 方法中,你应该如何识别一个新对象?

在 Django 中一次提交中执行多个 save() 的最佳方法

在 Django 模型中使用 save() 会产生 TypeError

Django,如何在调用super()后更新save()方法中的模型?

为啥 django ORM 的`save` 方法不返回保存的对象?