Django中访问/product/brand路径触发Products.DoesNotExist错误求助
Django Products.DoesNotExist 错误排查修复
问题现象
访问 /product/<productid> 路径功能正常,但访问 /product/<brand> 时触发错误:product.models.Products.DoesNotExist: Products matching query does not exist
错误原因
- URL 匹配顺序冲突:Django 按 URL 定义顺序匹配路由,
product/<str:productid>/和product/<str:brand>/均为字符串路径,访问品牌路径时会优先匹配productid路由,导致把品牌名称当作产品 ID 查询,最终因无匹配记录抛出异常。 - Getproduct 视图方法不规范:该类继承
APIView但未实现标准的get方法,自定义的get_object无法被 Django 正确调用;同时使用Products.objects.get(brand=brand)查询,无匹配记录时直接抛出异常,未做异常处理。 - 业务逻辑适配问题:一个品牌通常对应多个产品,用
get()仅能返回单条记录,不符合实际业务场景。
修复方案
1. 调整 URL 路由结构
给品牌查询路径添加明确前缀,避免模糊匹配冲突,修改后的 urls.py:
from django.urls import path from.views import GetListProduct, Topsellsviews, Getdetailproduct, Getproduct urlpatterns = [ path('product/', GetListProduct.as_view()), path('topsells/', Topsellsviews.as_view()), path('product/<str:productid>/', Getdetailproduct.as_view()), path('product/brand/<str:brand>/', Getproduct.as_view()), # 新增brand前缀区分路由 ]
2. 修复 Getproduct 视图类
实现标准 get 方法,处理异常并支持多产品序列化:
from rest_framework import status class Getproduct(APIView): def get(self, request, brand): # 查询该品牌下所有产品,避免单条查询的异常 products = Products.objects.filter(brand=brand) if not products.exists(): return Response({"error": "该品牌下无产品"}, status=status.HTTP_404_NOT_FOUND) serializer = ProductSerializer(products, many=True) return Response(serializer.data)
可选优化:给产品详情查询添加异常处理
避免直接抛出异常,返回友好提示:
from rest_framework import status class Getdetailproduct(APIView): def get(self, request, productid): try: detail = Products.objects.get(productid=productid) except Products.DoesNotExist: return Response({"error": "产品不存在"}, status=status.HTTP_404_NOT_FOUND) serializer = ProductSerializer(detail) return Response(serializer.data)
内容的提问来源于stack exchange,提问作者Pouyan jh
相关产品推荐
相关产品推荐

