Как использовать комбинацию annotate и aggregate sum в Django ORM

Из приведенной ниже таблицы мне нужно, чтобы вывод имел,

[(Яблоко,21.0),(Апельсин,12.0) ,(Виноград,15.0) ]

в основном фрукты, сгруппированные по сумме их стоимости

дата в (dd/mm//yyy)

Fruits Table
date        item    price
01/01/2021  Apple   5.0
01/01/2021  Orange  2.0
01/01/2021  Grapes  3.0
01/02/2021  Apple   7.0
01/02/2021  Orange  4.0
01/02/2021  Grapes  5.0
01/03/2021  Apple   9.0
01/03/2021  Orange  6.0
01/03/2021  Grapes  7.0
...........
....

models.py

 class Fruits(models.Model):
        item = models.CharField(max_length=32)
        date = models.DateField()
        price = models.FloatField()

Я попробовал следующий код, он не работает, как ожидалось

fruit_prices = Fruits.objects.filter(date__gte=quarter_start_date,date__lte=quarter_end_date)
               .aggregate(Sum('price')).annotate('item').values('item','price').distinct()

Вы можете работать с GROUP BY с:

from django.db.models import Sum

Fruits.objects.filter(
    date__range=(quarter_start_date, quarter_end_date)
).values('item').annotate(
    total=Sum('price')
).order_by('item')

Это создаст набор запросов, который будет выглядеть следующим образом:

<QuerySet [
    {'item': 'Apple', 'total': 21.0},
    {'item': 'Grapes', 'total': 15.0},
    {'item': 'Orange', 'total': 12.0}
]>

коллекция словарей, где ключи 'item' и total указывают на элемент и сумму всех price для этого item, удовлетворяющих заданному диапазону времени.

Однако я бы посоветовал сделать модель FruitItem и работать с ForeignKey, чтобы преобразовать моделирование вашей базы данных в Third Normal Form [wiki].

Вернуться на верх