在Django中计算模型属性的总和

Posted

技术标签:

【中文标题】在Django中计算模型属性的总和【英文标题】:Calculate the sum of model properties in Django 【发布时间】:2017-06-24 16:02:09 【问题描述】:

我有一个模型Order,它有一个属性,可以根据外键链接的OrderItems 计算order_total

我想计算多个Order 实例的order_total 属性的总和。

有没有办法做到这一点?

class Order(models.Model):
    customer = models.ForeignKey(Customer)
    placed = models.DateField()

    ...

    def get_total_cost(self):
        return sum(item.get_cost() for item in self.items.all())

    order_total = property(get_total_cost)


class OrderItem(models.Model):
    order = models.ForeignKey(Order, related_name="items")
    product = models.ForeignKey(Product, related_name="order_items")
    quantity = models.PositiveIntegerField(default=1)

    ...

    def get_cost(self):
        return self.product.price * self.quantity

这是我的查询:

>>> Order.objects.all().aggregate(Sum("order_total"))

返回此错误:

django.core.exceptions.FieldError: Cannot resolve keyword 'order_total' into field. Choices are: placed, customer, customer_id, id, items, paid

【问题讨论】:

看这个答案:***.com/a/3066607/641249 试试这个:docs.djangoproject.com/en/1.10/topics/db/aggregation/… 【参考方案1】:

您需要使用双下划线 __OrderItem 模型中以 order 作为查找字段的 order_total 的外键查找:

odrerObj = OrderItem.objects.all().aggregate(sum_order = Sum("order__order_total"))

但是如果你需要 Order oject 的 order_total 属性的总和,你可以使用这样的东西:

order_list = Order.objects.all()
total = 0
for item in order_list :
    total += item.order_total()

print total

【讨论】:

谢谢,我最终使用了您的第二个解决方案。

以上是关于在Django中计算模型属性的总和的主要内容,如果未能解决你的问题,请参考以下文章

Django:分组然后通过查询计算列值的总和

使用 Django 查询计算过滤列值的总和时出错

@each不更新计算的总和值

Django Rest Framework 过滤计算模型属性

django orm 和 postgresql 的累积(运行)总和

使用 Django ORM 注释查询以计算 2 个表值的总和