django - 购物车中 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 )
解决方案
您可以通过.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
:你可以在必要时计算它。
推荐阅读
- ios - React Native 应用程序的 iOS 构建文件夹在哪里?
- python - Python 随机字符
- mysql - 启动mysql和apache时出现Bitnami未知错误
- c - 如何用 for 循环或 while 循环替换 do while 循环?
- reactjs - 无法将 CSS 模块导入 React TypeScript 项目 #121
- nsis - NSIS:如何删除/隐藏 MUI_LICENSEPAGE_TEXT_BOTTOM?
- c++ - 我在构造函数调用期间面临运算符重载问题
- node.js - 我收到此错误:类型 '(err: Error) => void' 与类型 'QueryOptions'.ts(2559) 没有共同的属性,我不知道是什么原因
- html - 带有href图像内的文本框的悬停效果
- c# - POST请求C#中的Localbitcoins API签名