Как реализовать сообщения об ошибках проверки в django rest - PullRequest
1 голос
/ 07 мая 2020

Я только начинаю изучать python и django остальную структуру. Я создаю образец apis в django. У меня проблема, когда мне нужно установить сообщения об ошибках проверки.

Например, требуется электронная почта или электронная почта уже существует

Вот мой код:

Класс сериализатора:

class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        #fields = ['id','title','author','date']
        fields = '__all__'

views.py

def post(self,request):
        serializer = ArticleSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.error,status = status.HTTP_400_BAD_REQUEST)

Модель:

class Article(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=100)
    email = models.EmailField(max_length=100)
    date = models.DateTimeField(auto_now_add = True)


    def _str_(self):
        #self.fields['email'].required = False
        return self.title 

Ошибка:

'ArticleSerializer' object has no attribute 'error'

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

Вам не нужно обрабатывать проверку вручную:

def post(self, request):
    serializer = ArticleSerializer(data=request.data)
    serializer.is_valid(raise_exception=True):
    serializer.save()
    return Response(serializer.data, status=status.HTTP_201_CREATED)

Это вызовет исключение, но исключение будет обрабатываться DRF (если вы его правильно используете) и будет верните код состояния 400 с сообщениями об ошибках, как и ожидалось.

Кроме того, это представление работает более или менее точно так же, как CreateAPIView , вам, вероятно, будет лучше использовать это, чем изобретать заново колесо.

1 голос
/ 08 мая 2020

Попробуйте использовать serializer.errors (множественное число) вместо serializer.error.

Это позволит избежать получаемой вами ошибки и вернет ожидаемую HTTP-ошибку.

...