【发布时间】:2018-11-06 17:22:08
【问题描述】:
这是模型的简化版本:
class Toy(models.Model):
#generic fields
class Order(models.Model):
customer = models.ForeignKey(Customer)
class OrderItem(models.Model):
order = models.ForeignKey(Order)
toy = models.ForeignKey(Toy)
points = models.PositiveSmallIntegerField(default=3)
一个客户可以下多个订单,这会增加每个玩具的点数。
这个子查询,只返回OrderItem的第一行:
class Customer(models.Model):
def get_toys_with_points():
order_items = OrderItem(toy=models.OuterRef('pk'), order__customer=self)
toys = Toy.objects.annotate(
points_sum = models.Sum(Subquery(order_items.values('points')))
)
return toys
所以,当我把它放到我的模板中时:
{% for toy in customer.get_toys_with_points %}
{{ toy.points_sum }}
{% endfor %}
我总是得到第一行的价值(即使有更多的购买,例如总和为 25)。
【问题讨论】:
-
我认为这样做的方法是没有 Daniel Roseman 下面回答的子查询。只是为了获得更多信息,here's the django doc 描述了对子查询进行聚合的only 方式。我认为您的方法由于评估顺序而变得混乱。
标签: django django-aggregation django-annotate