Как создать отчет, показывающий доход по продуктам по годам в Django?
Начиная с этой модели:
class LineItem(models.Model):
created = models.DateTimeField(default=timezone.now)
price = models.DecimalField(max_digits=8, decimal_places=2)
product = models.CharField(max_length=15)
Из этого я хочу создать отчет следующего содержания:
Product. | 2020 | 2021 | 2022
ProdA | $10,000.00 | $9,500.00 | $3,200.00
ProdB | $110,000.00 | $98,000.00 | $35,300.00
ProdC | $119,500.00 | $54,000.00 | $25,300.00
Для этого я мог бы использовать несколько запросов для создания последовательности словарей, примерно так:
[
{
"product": "ProdA",
2020: 10000.00,
2021: 9500.00,
2022: 3200.00,
},
{
"product": "ProdB",
2020: 110000.00,
2021: 98000.00,
2022: 35300.00,
},
{
"product": "ProdC",
2020: 119500.00,
2021: 54000.00,
2022: 25300.00,
},
]
Но мне интересно, есть ли лучший способ (например, с одним запросом). Буду признателен за любые идеи.
Аннотация - один из способов сделать это. https://docs.djangoproject.com/fr/4.0/topics/db/aggregation/
Вы можете использовать TruncYear и Sum.
from django.db.models import Sum
from django.db.models.functions import TruncYear
LineItem.objects.all()\
.annotate(year=TruncYear('created'))\
.values('year', 'product').annotate(total_price=Sum('price'))\
.values('year', 'total_price', 'product')