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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 00:01:36