我正尝试使用模型中的方法提取订单金额,但不能。发生错误-'int' object is not iterable
models.py
class OrderItem(models.Model):
order = models.ForeignKey(Order, on_delete=models.PROTECT)
product = models.ForeignKey(Product, on_delete=models.PROTECT)
price = models.IntegerField()
quantity = models.PositiveIntegerField(default=1)
def get_total_price(self):
return sum(self.get_price())
def get_price(self):
return self.price * self.quantity
def __str__(self):
return str(self.order)
get_price方法有效,但是在get_total_price中有错误,我在做什么错了?
order_success.html
{% for item in order_item %}
<tr>
<td>{{item.quantity}}</td>
<td>{{item.price}}</td>
<td>{{item.get_price}}</td>
</tr>
{% endfor %}
<h2>To pay - {{order_item.get_total_price}}</h2> # doesn't work
请帮我写出正确的求和方法。我认为我的方法是错误的。
答案 0 :(得分:2)
请帮我写出正确的求和方法。我认为我的方法是错误的。
我认为您的建模是错误的。 OrderItem
没有total_price
,它有一个特定的price
,即数量乘以单价,但是总价是整个查询集的一个属性。
不过,我们可以通过在视图中使用查询集来计算此类汇总,例如:
from django.db.models import F, Sum
def some_view(request):
order_items = OrderItems.object.all() # might be a different query
aggrs = order_items.aggregate(
total_price=Sum(F('quantity') * F('price'))
)
context = {
'order_items': order_items,
'aggrs': aggrs
}
return render(request, 'some_template.html', context)
在模板中,我们可以像这样渲染它:
{% for item in order_items %}
<tr>
<td>{{item.quantity}}</td>
<td>{{item.price}}</td>
<td>{{item.get_price}}</td>
</tr>
{% endfor %}
<h2>To pay - {{ aggr.total_price }}</h2>
注意:由于您的
order_item
是一个集合,因此使用复数(例如本示例视图中的order_items
更有意义)。
注意:在Order
模型上定义它很有意义,例如:那么我们可以写class Order(models.Model): # ... @property def total_price(): return self.order_item_set.aggregate( total_price=Sum(F('quantity') * F('price')) )['total_price']
some_order.total_price
以获得该Order
对象的总价。
注意:您有一个
price
字段和一个get_price
方法,这有点令人困惑,也许您应该考虑将price
重命名为unit_price
,然后将get_price
设为名为@property
的{{1}}。