Django删除购物车商品时报QuerySet精确查询需限制为单个结果错误如何解决
问题根源
你代码中的product.objects.filter(slug = slug)返回的是QuerySet查询集(多个对象的集合类型),即便只有一条匹配结果,也不能直接用于外键字段的=精确匹配条件,Django要求该场景下必须传入单个模型实例或者主键值,因此触发报错。
此外你当前的删除逻辑存在业务漏洞:没有关联当前登录用户过滤,会直接删除所有用户购物车中的对应商品,需要同步修复。
解决方法
有两种常用修复方案,推荐优先使用第一种,执行效率更高:
方案1:跨表查询直接删除(推荐)
不需要单独查询商品对象,直接通过外键关联的slug字段过滤,同时补充当前登录用户的过滤条件:
# 先引入登录校验装饰器 from django.contrib.auth.decorators import login_required @login_required def remove_cart(request , slug): url = request.META.get('HTTP_REFERER') # 仅删除当前用户购物车中的目标商品,一次查询完成操作 Cart.objects.filter(user=request.user, produ__slug=slug).delete() return redirect(url)
方案2:先查询单个商品实例再删除
如果你需要先校验商品是否存在,可以把filter改为get获取单个商品实例:
from django.contrib.auth.decorators import login_required from django.shortcuts import get_object_or_404 @login_required def remove_cart(request , slug): url = request.META.get('HTTP_REFERER') # 获取单个商品实例,不存在则直接返回404 ca = get_object_or_404(product, slug=slug) # 仅删除当前用户的对应购物车项 Cart.objects.filter(user=request.user, produ=ca).delete() return redirect(url)
内容的提问来源于stack exchange,提问作者alireza
相关产品推荐
相关产品推荐

