Django / Как получить сумму порядка - объект 'int' не повторяется - PullRequest
1 голос
/ 26 мая 2019

Я пытаюсь снять сумму заказа, используя метод из модели, но не могу. Есть ошибка - '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

Не могли бы вы помочь мне правильно написать метод сумм, пожалуйста. Я думаю, что мой метод неправильный.

1 Ответ

2 голосов
/ 26 мая 2019

Можете ли вы помочь мне написать правильный метод суммы, пожалуйста.Я думаю, что мой метод неверен.

Я думаю, что ваше моделирование неверно.У 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...