DRF Viewset实现存在性校验:对象存在返400不存在返200的问题解决
问题原因
DRF ModelViewSet 内置的get_object()方法会自动从配置的查询集中匹配lookup_field对应的实例,匹配不到时直接抛出404异常,不会执行你后续判断不存在返回200的逻辑,这是你遇到问题的核心原因。
修复方案
你不需要调用默认的get_object()方法,自行做存在性校验即可,修改后的views.py代码如下:
from rest_framework import viewsets, status from rest_framework.response import Response from .models import Item class ItemCheckViewSet(viewsets.ModelViewSet): """ 执行物品校验时返回的视图 """ lookup_field = 'name' queryset = Item.objects.all() def retrieve(self, request, *args, **kwargs): # 获取路径参数中传入的物品名称 item_name = kwargs.get('name') # 直接判断该名称的物品是否存在 item_exists = self.get_queryset().filter(name=item_name).exists() if item_exists: return Response("Item already exists", status=status.HTTP_400_BAD_REQUEST) return Response("Item does not exist", status=status.HTTP_200_OK)
补充说明
你当前的业务只需要判断物品存在性,不需要序列化物品数据,所以原代码里的get_serializer_class方法、序列化器引入都可以直接删除,不需要保留冗余逻辑。
内容的提问来源于stack exchange,提问作者noobmaster69
相关产品推荐
相关产品推荐

