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)