Агрегатная сумма в Django. Сумма объектов с одинаковым именем
У меня есть следующий QuerySet, это список покупок:
<QuerySet
[
<Cart_object: {name: 'Apple', amount: 10}, {name: 'Bananas', amount: 20},
<Cart_object: {name: 'Bananas', amount: 10}>
]
>
Я применяю к нему следующий код и получаю сумму всех продуктов для каждого из объектов:
for obj in cart:
from_cart = UserProduct.objects.filter(obj=obj).aggregate(Sum('amount'))
print(from_cart)
Выход:
{'amount__sum': 30}
{'amount__sum': 10}
Вопрос заключается в следующем. Как использовать агрегат (Sum('amount')) для добавления только тех объектов, которые имеют одинаковое "имя". Чтобы получить один объект Cart_object, в котором 'Apple' = 10, а 'Bananas' = 30 (Так как есть записи с одинаковым именем)
<Cart_object: {name: 'Apple', amount: 10}, {name: 'Bananas', amount: 30}>
пробовали ли вы использовать выражение GROUP BY?
UserProduct.objects.values("obj").annotate(sum=Sum('amount')).order_by("obj")
SQL-команда для этого - SELECT "userproduct"."name", SUM("userproduct"."amount") AS "the_amount" FROM "table" GROUP BY "userproduct"."name"
.
Что вы можете иметь с Django, если сделаете:
from django.db.models import Sum
UserProduct.objects.values('name').annotate(the_amount=Sum('amount'))