首页 > 解决方案 > 购物车中 OrderItems 的 Django 总价

问题描述

如何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 )

标签: django

解决方案


您可以通过.annotate(…)[Django-doc]获得总数,从而在数据库端进行计算:

from django.db.models import F, Sum

def cart(request):
    cart = Cart.objects.annotate(
        price=Sum(F('orderitem__item__price') * F('orderitem__quantity'))
    ).get(
        order_user=request.user
    )
    cart.total = cart.price
    cart.save()
    # …

由此cart产生的对象将具有一个额外的属性,该属性.price包含物品的价格乘以相应的数量。

但这也说明了为什么你不应该你的 中保留一个total字段Cart:你可以在必要时计算它。


推荐阅读