Это упрощенная версия моделей:
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).