【问题标题】:DRF Viewset - Return a 400 if object exists and a 200 if it doesn'tDRF Viewset - 如果对象存在则返回 400,如果不存在则返回 200
【发布时间】:2021-09-02 21:48:04
【问题描述】:

使用 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__"

【问题讨论】:

标签: python django django-rest-framework


【解决方案1】:

如果对象存在,则无需序列化,您只需检查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)

【讨论】:

    【解决方案2】:

    您可以通过覆盖 get_object 方法来做到这一点。默认情况下,此方法使用get_object_or_404(queryset, **filter_kwargs)。当此方法找不到对象时,引发 Http404 并返回 404 状态码。但是您必须注意其他请求操作,例如发布、放置。此操作还询问对象常见的get_object 方法

    【讨论】:

      猜你喜欢
      • 2019-09-10
      • 1970-01-01
      • 2019-02-15
      • 2018-04-10
      • 1970-01-01
      • 1970-01-01
      • 2019-05-23
      • 1970-01-01
      • 2011-10-19
      相关资源
      最近更新 更多