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

Django实现加入购物车功能调用get_or_create遇错求助

加入购物车功能报错修复方案

问题场景

开发加入购物车功能时,点击按钮触发错误,当前使用get_or_create函数实现逻辑,错误截图如下:
错误截图

原代码

views.py

def add_to_cart(request, slug):
    item = get_object_or_404(Item, slug=slug)
    order_item = OrderItem.objects.get_or_create(
        item=item,
        user=request.user,
        ordered=False
    )
    order_qs = Order.objects.filter(user=request.user, ordered=False)
    if order_qs.exists():
        order = order_qs[0]
        # 检查商品是否已在订单中
        if order.items.filter(item__slug=item.slug).exists():
            order_item.quantity += 1
            order_item.save()
        else:
            order.items.add(order_item)
    else:
        ordered_date = timezone.now()
        order = Order.objects.create(
            user=request.user, ordered_date=ordered_date)
        order.items.add(order_item)
    return redirect("core:product", slug=slug)

models.py

class OrderItem(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, 
                             on_delete=models.CASCADE)
    ordered = models.BooleanField(default=False)
    item = models.ForeignKey(Item, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)

    def __str__(self):
        return f"{self.quantity} of {self.item.title}"


class Order(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, 
                             on_delete=models.CASCADE)
    items = models.ManyToManyField(OrderItem)
    start_date = models.DateTimeField(auto_now_add=True)
    ordered_date = models.DateTimeField()
    ordered = models.BooleanField(default=False)

问题根源

get_or_create()方法返回的是**(实例对象, 创建状态)**的元组,不是单个OrderItem对象。原代码直接将元组赋值给order_item,后续调用order_item.quantity时会抛出"元组没有quantity属性"的错误。

修复后的代码

views.py

def add_to_cart(request, slug):
    item = get_object_or_404(Item, slug=slug)
    # 解构get_or_create的返回值,获取实际的OrderItem对象
    order_item, created = OrderItem.objects.get_or_create(
        item=item,
        user=request.user,
        ordered=False
    )
    order_qs = Order.objects.filter(user=request.user, ordered=False)
    if order_qs.exists():
        order = order_qs[0]
        # 检查当前商品是否已在购物车中
        if order.items.filter(item__slug=item.slug).exists():
            order_item.quantity += 1
            order_item.save()
        else:
            order.items.add(order_item)
    else:
        ordered_date = timezone.now()
        order = Order.objects.create(
            user=request.user, ordered_date=ordered_date)
        order.items.add(order_item)
    return redirect("core:product", slug=slug)

额外说明

  • created是布尔值,标记该OrderItem是新创建的还是已存在的,若后续需要根据创建状态做额外逻辑,可直接使用这个变量
  • 确保Order模型的ordered_date字段在创建时被正确赋值(当前代码已处理)

内容的提问来源于stack exchange,提问作者Ali harazimi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 02:06:52