Как использовать комбинацию 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].