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
相关产品推荐
相关产品推荐

