Django: возвращать сериализатор ValidationError в методе сохранения модели ()
Я использую django-rest-framework для создания Rest API в рамках Django. И можно вернуть любой validationError
помимо методов сериализатора.
Но мне было интересно, можно ли вернуть ошибки из save()
метод модели django, который переводится в отдых django 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, который говорит, например, "достигнут предел"
3 ответа
DRF ValidationError
обрабатывается в сериализаторе, поэтому вы должны отлавливать любые ожидаемые ошибки при вызове метода сохранения вашей модели и использовать его для вызова ValiddationError
,
Например, вы можете сделать это в методе сохранения вашего сериализатора:
def save(self, **kwargs):
try:
super().save(**kwargs)
except ModelError as e:
raise serializers.ValidationError(e)
куда ModelError
ошибка, которую вы поднимаете в своей модели
Есть два-три способа сделать это
1. Используя чистый метод.
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.'))
Использование сигналов.
@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.'))
Почему бы вам не поднять ValidationError сериализатора?
from rest_framework.serializers import ValidationError
...
def clean(self):
if not valid:
raise ValidationError({"field": _("this is not valid")})