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 model 的 save()
方法返回错误,这些错误会被转换为 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 ValueError
或raise 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