Django计算Cart模型OrderItem总价格及解决QuerySet无total属性错误
错误原因
- 你的
cart变量是通过filter()方法获取的,该方法返回的是QuerySet查询集对象(类似列表的集合),而不是单个Cart模型实例,自然不存在total属性,同时你原有循环里的累加逻辑也有问题,会出现重复计算的错误。 - 另外
Cart模型中order_user是OneToOneField一对一关联,每个用户只会对应唯一的未下单购物车,不需要用filter查询集合。
修复方案
方案1:调整原有遍历逻辑
def cart(request): # 一对一关联直接获取单个购物车实例,不存在则自动创建 cart, created = Cart.objects.get_or_create(order_user=request.user, ordered=False) order_items = OrderItem.objects.filter(cart=cart) total = 0 for i in order_items: # 逐个累加订单项金额到临时变量 total += i.quantity * i.item.price # 循环结束后统一更新购物车总金额,无需循环内重复更新 cart.total = total cart.save() # 此处补充你自己的视图返回逻辑
方案2:更高效的数据库聚合写法(性能更高)
直接在数据库层面完成计算,不需要把所有订单项加载到内存:
from django.db.models import Sum, F def cart(request): cart, created = Cart.objects.get_or_create(order_user=request.user, ordered=False) # 直接计算所有订单项总价:数量*单价 求和,无订单项时默认返回0 total_calc = OrderItem.objects.filter(cart=cart).aggregate( total=Sum(F('quantity') * F('item__price')) )['total'] or 0 cart.total = total_calc cart.save() # 此处补充你自己的视图返回逻辑
内容的提问来源于stack exchange,提问作者Kay
相关产品推荐
相关产品推荐

