Django子查询只返回第一个元素

Django子查询只返回第一个元素,django,django-aggregation,django-annotate,Django,Django Aggregation,Django Annotate,这是模型的简化版本: 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

这是模型的简化版本:

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)。

这里不需要子查询

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

这里不需要子查询

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

我认为这样做的方法是不使用下面由Daniel Roseman回答的子查询。仅提供更多信息,描述在子查询上进行聚合的唯一方法。我认为你的方法因为评估的顺序而变得混乱。我认为这样做的方法是不使用下面由Daniel Roseman回答的子查询。仅提供更多信息,描述在子查询上进行聚合的唯一方法。我认为你的方法因为评估的顺序而变得混乱。有一个奇怪的问题,只要我添加除points_sum(即points_sum2)之外的另一个注释,它就会毫无理由地将points_sum的值加倍。有什么办法解决这个问题吗?有一个奇怪的问题,只要我添加除了points_sum(即points_sum2)之外的另一个注释,它就会毫无理由地将points_sum的值加倍。有没有办法解决这个问题?