Django /如何获得订单总和-'int'对象不可迭代

时间:2019-05-26 12:42:45

标签: django

我正尝试使用模型中的方法提取订单金额,但不能。发生错误-'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 个答案:

答案 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}}。