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)
现有代码问题
- 逻辑偏离需求:当前用
Shops.objects.filter(items="Banana")检查所有店铺是否卖香蕉,而非判断传入ID的目标店铺,不符合需求。 - 冗余判断:
if id:完全多余,id是URL路径参数必然存在,且前面已通过get(id=id)查询,无实际意义。 - 未处理异常:
Shops.objects.get(id=id)若ID不存在会抛出DoesNotExist异常,直接返回500错误,无友好提示。 - 硬编码风险:直接写
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
相关产品推荐
相关产品推荐

