You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 06:54:03