Выберите 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)