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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 12:53:13