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

时间:2018-11-06 17:22:09

标签: 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.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次)。

1 个答案:

答案 0 :(得分:3)

您在这里不需要子查询。

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