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

Django Rest Framework中检查模型字段值存在后返回指定记录

需求与代码优化方案

需求说明

基于Django Rest Framework(DRF)开发,模型存储多店铺数据,使用默认ID字段作为店铺主键。需实现两个核心逻辑:

  • 检查指定ID的店铺是否售卖香蕉
  • 返回该指定店铺的详细信息

现有代码

models.py

class Shops(models.Model):
    STATE = Choices(
        ('Egg', 'EGG'),
        ('Banana', 'BANANA'),
        ('Orange', 'ORANGE'),        
    )
    shop = models.CharField(max_length=100)    
    quantity = models.IntegerField()
    items = models.CharField(max_length=11, choices=STATE, default='Egg')

serializers.py

class ShopSerializer(serializers.ModelSerializer):
    items = ChoicesField(choices=Shops.STATE)
    class Meta:
        model = Shops
        fields = '__all__'

views.py

class CheckShopsView(APIView):
    def get(self, request, id):
        res = Shops.objects.get(id=id)
        if id:
            serializers = ShopSerializer(res)
            if Shops.objects.filter(items="Banana"):
                return Response({
                    'status': 'Success',
                    "Shop": serializers.data
                }, status=status.HTTP_200_OK)
            else:
                return Response({
                    'status': 'Not Applicable',
                    "Shop": serializers.data
                }, status=status.HTTP_200_OK)

现有代码问题

  1. 逻辑偏离需求:当前用Shops.objects.filter(items="Banana")检查所有店铺是否卖香蕉,而非判断传入ID的目标店铺,不符合需求。
  2. 冗余判断:if id:完全多余,id是URL路径参数必然存在,且前面已通过get(id=id)查询,无实际意义。
  3. 未处理异常:Shops.objects.get(id=id)若ID不存在会抛出DoesNotExist异常,直接返回500错误,无友好提示。
  4. 硬编码风险:直接写items="Banana",未使用模型常量引用,后期修改选项易出错。

修正后的代码

views.py 优化版

from django.http import Http404
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status
from .models import Shops
from .serializers import ShopSerializer

class CheckShopsView(APIView):
    def get(self, request, id):
        try:
            shop = Shops.objects.get(id=id)
        except Shops.DoesNotExist:
            return Response({
                'status': 'Error',
                'message': '指定ID的店铺不存在'
            }, status=status.HTTP_404_NOT_FOUND)
        
        serializer = ShopSerializer(shop)
        # 判断当前店铺是否售卖香蕉
        status_msg = 'Success' if shop.items == Shops.STATE.Banana else 'Not Applicable'
        
        return Response({
            'status': status_msg,
            'Shop': serializer.data
        }, status=status.HTTP_200_OK)

额外优化建议

  • 模型类名改为Shop(单数形式,符合Django模型命名规范)
  • 将STATE重命名为ITEM_CHOICES,语义更清晰
  • 若ChoicesField是自定义字段需确保正确导入,否则可改用DRF默认ChoiceField

内容的提问来源于stack exchange,提问作者Xero67

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 15:01:02