Django访问home视图报No product matches the given query错误排查
问题现象
在views.py的home函数编写product相关查询逻辑时,触发如下报错:
No product matches the given query.

关联项目代码
views.py
class productviewset(viewsets.ModelViewSet): queryset=product.objects.all() serializer_class = productSerializer def create(self, request): serialized = productSerializer(data=request.data, many=True) if serialized.is_valid(): serialized.save() return Response(serialized.data, status=status.HTTP_201_CREATED) return Response(serialized._errors, status=status.HTTP_400_BAD_REQUEST) @action (detail=False , methods=['post']) def delete(self,request): product.objects.all().delete() return Response('success') def home(request ): p=get_object_or_404(product,pk=1) return render(request,'home.html',{'p':p}) def foods(request): return render(request,'foods.html',{'p':category.objects.all()})
models.py
class category(models.Model): name=models.CharField(max_length=255, db_index=True) def __str__(self): return self.name class product(models.Model): category = models.ForeignKey(category, related_name='products',on_delete=models.CASCADE) image=models.CharField(max_length=500) description=models.CharField(max_length=500) price=models.CharField(max_length=50) buy=models.CharField(max_length=100)
urls.py
from django.urls import include, path from rest_framework import routers from quick.views import productviewset from quick import views from django.contrib import admin urlpatterns = [ path('api/', include(router.urls)), path('',views.home), path('foods',views.foods), path('admin/',admin.site.urls), ]
报错原因
这个错误是Djangoget_object_or_404方法的标准触发逻辑:当查询条件匹配不到任何数据库记录时,直接抛出404异常。本次报错的具体触发场景:
home视图里硬编码写死了查询主键pk=1的product记录,但当前数据库中不存在主键为1的product数据- 你在
productviewset中自定义了批量删除接口,执行逻辑为product.objects.all().delete(),如果之前调用过这个接口,会清空product表全量数据,自然不存在pk=1的记录 - 如果从未创建过product数据,或者曾经创建过pk=1的记录但后续被删除(数据库自增主键不会重复复用已删除的id值),同样会触发该报错
修复方案
- 测试阶段如果需要固定查询pk=1的记录,先通过admin后台或产品创建接口插入一条product数据,确保主键为1的记录存在即可
- 不要硬编码固定主键查询,根据业务逻辑动态传入要查询的商品id,参考示例:
def home(request): # 从url请求参数中获取商品id product_id = request.GET.get('pid') p = get_object_or_404(product, pk=product_id) return render(request,'home.html',{'p':p})
- 如果首页不需要强依赖某条商品存在,可以替换为容错查询,查询不到时返回空值而不是抛404:
def home(request): # 取最新创建的第一条商品,无数据时p为None p = product.objects.order_by('-id').first() return render(request,'home.html',{'p':p})
额外提示:Python类名推荐遵循大驼峰命名规范,建议将
category/product/productviewset等类名调整为Category/Product/ProductViewSet,符合PEP8编码标准;另外你的urls.py中router未实例化、也未注册视图集,访问api路径时会触发报错,需要补充对应初始化和注册逻辑。
内容的提问来源于stack exchange,提问作者kan
相关产品推荐
相关产品推荐

