【问题标题】:Django Subquery returns only the first elementDjango 子查询只返回第一个元素
【发布时间】: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


【解决方案1】:

这里不需要子查询。

toys = Toy.objects.filter(orderitem__order__customer=self).annotate(
    points_sum=models.Sum('orderitem__points')
)

【讨论】:

  • 有一个奇怪的问题,只要我添加了除 points_sum 之外的另一个注释(即 points_sum2),它就会无缘无故地使 points_sum 的值加倍。任何想法如何解决这个问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-03
  • 2011-07-12
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
相关资源
最近更新 更多