Как создать отчет, показывающий доход по продуктам по годам в 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')
Вернуться на верх