DRF Viewset - Возвращает 400, если объект существует, и 200, если не существует

Используя Django Rest Framework, я пытаюсь создать конечную точку API для определения того, существует ли уже заданное имя элемента.

Если существует, то мы должны сообщить об этом фронтенд-приложению, вернув 400 Bad Request. Если его не существует, то мы посылаем положительный запрос 200 OK.

Я обнаружил, что могу отправить 400, но если товара не существует, я получаю сообщение 404, с которым ничего не могу сделать.

views.py

from rest_framework import viewsets,status
from rest_framework.response import Response
from .serializers import *

class ItemCheckViewSet(viewsets.ModelViewSet):
    """
    The views that are returned when we peform checks against the items
    """
    lookup_field = 'name'
    queryset = Item.objects.all()

    def get_serializer_class(self):
        return ItemSerializer

    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        serializer = self.get_serializer(instance)

        if len(serializer.data) > 0:
            return Response("Item already exists", status.HTTP_400_BAD_REQUEST)

        return Response("Item does not exist", status.HTTP_200_OK)

serializers.py

from rest_framework import serializers
from .models import Item


class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields = "__all__"

Вы можете сделать это, переопределив метод get_object. По умолчанию этот метод использует get_object_or_404(queryset, **filter_kwargs). Когда этот метод не может найти объект, возникает ошибка Http404 и возвращается код состояния 404. Но вы должны быть внимательны к другим запросам, например post, put. Эти действия также спрашивают об объекте обычным методом get_object

Нет необходимости в сериализации, если объект существует, и вы можете просто проверить, был ли поднят Http404 из get_object:

from django.http import Http404


class ItemCheckViewSet(viewsets.ModelViewSet):
    ...
    def retrieve(self, request, *args, **kwargs):
        try:
            instance = self.get_object()
        except Http404:
            return Response("Item does not exist", status.HTTP_200_OK)
        return Response("Item already exists", status.HTTP_400_BAD_REQUEST)
Вернуться на верх