Django报错:'tuple' object has no attribute 'quantity' 购物车功能异常
解决Django购物车报错:'tuple' object has no attribute 'quantity'
问题根源
OrderItem.objects.get_or_create()方法返回的是元组(模型实例, 创建状态布尔值),你直接将这个元组赋值给了order_item,后续尝试访问order_item.quantity时,自然会触发"元组没有quantity属性"的错误。
修复方案
解构get_or_create的返回值,单独取出模型实例;同时调整逻辑,确保对购物车商品数量的修改和关联操作都作用在实例上。
修改后的完整代码
class OrderItem(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) item = models.ForeignKey(Product, on_delete=models.CASCADE) quantity = models.IntegerField(default=1) cart = models.BooleanField(default=True) order = models.BooleanField(default=False) class Orders(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) items = models.ManyToManyField(OrderItem) def add_to_cart(request, pk): item = get_object_or_404(Product, pk=pk) # 解构get_or_create的返回值,拿到实例对象 order_item, created = OrderItem.objects.get_or_create( item=item, user=request.user, order=False ) order_qs = Orders.objects.filter(user=request.user) if order_qs.exists(): order = order_qs.first() if order.items.filter(item__pk=item.pk).exists(): # 操作实例的quantity属性 order_item.quantity += 1 order_item.save() return redirect("product-detail", pk=pk) else: # 将实例添加到多对多关系中 order.items.add(order_item) return redirect("product-detail", pk=pk) else: order = Orders.objects.create(user=request.user) order.items.add(order_item) return redirect("product-detail", pk=pk)
额外优化提示
- 用
order_qs.first()替代order_qs[0],更符合Django查询集的使用规范 - 若要避免并发场景下的数量错误,可使用
F()表达式更新数量:from django.db.models import F order_item.quantity = F('quantity') + 1 order_item.save()
内容的提问来源于stack exchange,提问作者nameless
相关产品推荐
相关产品推荐

