Выберите TruncYear, начиная с определенного года

У меня есть транзакции, хранящиеся в таблице, для выбора последних 3 лет я написал простой запрос в Django. Я сделал это в середине прошлого года, и, казалось, все было в порядке. Теперь было бы неплохо, если бы он возвращал мне 2025 год с 0, как я могу этого добиться?

Текущий запрос:

Transactions.objects
.annotate(year=TruncYear('timestamp'))
.values('year')
.order_by('-year')
.annotate(total=Sum('amount'))
.values('year', 'total')[:3]

Это возвращает мне данные за 2024, 2023, 2022 годы, что хорошо, но было бы приятнее, если бы он возвращал данные за 2025, 2024, 2023

Что-то вроде изменения, чтобы получить текущий год и просматривать таблицу с этого момента. независимо от того, есть ли в транзакциях таблицы данные за этот год или нет.

Для этого вы можете изменить запрос, включив в него current year, а затем использовать комбинацию annotate, Sum, and Coalesce, чтобы убедиться, что он предоставляет итоговые значения для данного года, которые отсутствуют, и устанавливает их по умолчанию в 0. Затем вы можете динамически построить набор ожидаемых лет и объединить их с результатами запроса.

Полагаю, это вам подойдет:

from django.db.models import Sum, Value
from django.db.models.functions import Coalesce, TruncYear
from datetime import datetime

current_year = datetime.now().year

years_to_include = [current_year, current_year - 1, current_year - 2]

results = (
    Transactions.objects
    .annotate(year=TruncYear('timestamp'))
    .values('year')
    .order_by('-year')
    .annotate(total=Coalesce(Sum('amount'), Value(0)))  # Default missing totals to 0
    .values('year', 'total')
)

results_dict = {result['year'].year: result['total'] for result in results}

final_results = [
    {'year': year, 'total': results_dict.get(year, 0)}
    for year in years_to_include
]

print(final_results)
Вернуться на верх