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.'))
  1. Использование сигналов.

    @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")})

Другие вопросы по тегам