Можете ли вы помочь мне написать правильный метод суммы, пожалуйста.Я думаю, что мой метод неверен.
Я думаю, что ваше моделирование неверно.У 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(
<b>total_price=Sum(F('quantity') * F('price'))</b>
)
context = {
'order_items': order_items,
'aggrs': aggrs
}
return render(request, 'some_template.html', context)
В шаблоне мы можем затем отобразить его следующим образом:
{% for item in <b>order_items</b> %}
<tr>
<td>{{item.quantity}}</td>
<td>{{item.price}}</td>
<td>{{item.get_price}}</td>
</tr>
{% endfor %}
<h2>To pay - {{ <b>aggr.total_price</b> }}</h2>
Примечание : поскольку ваша order_item
является коллекцией, имеет смысл использовать plular (например, 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
a @property
с именем price
.