Django rest framework - ошибка ValidationError, возникающая в методе сохранения моделей.Как передать ошибку в http ответ - PullRequest
0 голосов
/ 12 февраля 2019

Я использую среду отдыха django с ModelViewset:

class FooViewset(viewsets.ModelViewSet):
    serializer_class = FooSerializer
    queryset = Foo.objects.all()

и ModelSerializer:

class FooSerializer(serializers.ModelSerializer):

    class Meta:
        model = Foo
        fields = [
            "id",
            "bar",
            "baz",
        ]

У меня также есть метод сохранения модели:

class Foo(models.Model):
    ...
    def save(self):
        if condition:
            raise ValidationError("Illegal parameters")
        return super().save(*args, **kwargs)

При возникновении этой ошибки проверки drf отправляет ответ 500 во внешний интерфейс без текста.Как заставить его вместо этого дать ответ «неверный запрос» с текстом в ValidationError (параметр Illegal)?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Вы можете написать свою пользовательскую ошибку, например:

from rest_framework.exceptions import APIException
from rest_framework.status import HTTP_400_BAD_REQUEST

class MyError(APIException):
    """Readers error class"""
    def __init__(self, msg):
        APIException.__init__(self, msg)
        self.status_code = HTTP_400_BAD_REQUEST
        self.message = msg

И вернуть любой код состояния, какой хотите.

Вы можете использовать его в обычном режиме, где хотите, например:

raise MyError({"detail": "You did something wrong!"})
0 голосов
/ 12 февраля 2019
from rest_framework import serializers


class Foo(models.Model):
...
    def save(self):
        if condition:
            raise serializers.ValidationError("Illegal parameters")
        return super().save(*args, **kwargs)

Я не проверял это.

Вместо этого я бы рекомендовал делать это в методе create вашего сериализатора.

from rest_framework import serializers

class FooSerializer(serializers.ModelSerializer):

    class Meta:
        model = Foo
        fields = [
            "id",
            "bar",
            "baz",
        ]

    def create(self, validated_data):
        if condition:
            raise serializers.ValidationError("Illegal parameters")
        instance = super(FooSerializer, self).create(validated_data)
        instance.save()
        return instance
...