我如何从下面的这些模型中获得购物车模型中OrderItem
项目的“总”价格?我尝试在视图中做一些事情,但我得到QuerySet object has no attribute 'total'
的属性错误
# views.py
def cart(request):
cart = Cart.objects.filter(order_user=request.user)
order_items = OrderItem.objects.filter(cart__in=cart)
total = 0
for i in order_items:
total = i.quantity * i.item.price + cart.total
cart.update(total=total)
# models.py
class OrderItem(models.Model):
cart = models.ForeignKey('Cart', on_delete=CASCADE, null=True)
item = models.ForeignKey(Item, on_delete=CASCADE, null=True)
quantity = models.IntegerField(default=1)
class Item(Visits, models.Model):
title = models.CharField(max_length=150)
price = models.IntegerField(default=1000)
image = models.ImageField(upload_to='pictures', default='static/images/man.png')
description = models.TextField(default="Item")
visits = models.IntegerField(default=0)
class Cart(models.Model):
order_user = models.OneToOneField(User, on_delete=CASCADE)
ordered = models.BooleanField(default=False)
total = models.IntegerField(default=0, help_text="100 = 1EUR")
order_items = models.ManyToManyField(Item, related_name='carts', through=OrderItem )
3条答案
按热度按时间s1ag04yj1#
您可以通过**
.annotate(…)
**[Django-doc]获取总数,从而在数据库端计算:由此产生的
cart
对象将有一个额外的属性.price
,它包含物品的价格乘以相应的数量。但这也说明了为什么你不应该在
Cart
中保留total
字段:你可以在必要的时候计算。rt4zxlrg2#
问题来自for循环中的第一行,在那里你写了:
在这里,购物车是一个
QuerySet
,因为当您在cart方法的第一行中从 Cart 模型中检索cart
对象时使用了filter
。filter
返回QuerySet
,而不是object。您可以使用get
来获取cart
对象,因为在 Cart 和 User 模型之间存在OneToOne关系。在你的cart方法的第一行试试:当你想更新一个对象时,你还需要使用
save
方法而不是update
。update
方法只属于QuerySet。h22fl7wq3#