Python группирует список лет, месяцев для удаления дублирования лет
У меня есть таблица, содержащая заказы, в которой есть столбец даты. Я хочу получить совокупность лет и месяцев из этого столбца, чтобы использовать эти данные в фильтре на передней панели.
Мне удалось вернуть эти данные, однако они не отформатированы так, как мне бы хотелось.
Python
years = purchase_orders.objects.filter(user_id=info.context.user.id).annotate(year=ExtractYear('date'), month=ExtractMonth('date'),).order_by().values_list('year', 'month').order_by('year', 'month').distinct()
Данные возвращены
<QuerySet [(2020, 3), (2021, 4), (2022, 1), (2022, 2), (2022, 3), (2022, 4), (2022, 5)]>
Идеальный формат
<QuerySet [(2020, (3)), (2021, (4)), (2022, (1, 2, 3, 4, 5))]>
You can work with the groupby(…)
function [Python-doc] of the itertools
module [Python-doc]:
from itertools import groupby
from operator import itemgetter
years = purchase_orders.objects.filter(
user=info.context.user
).values(
year=ExtractYear('date'),
month=ExtractMonth('date')
).order_by('year', 'month').distinct()
years = [
(y, [ym['month'] for ym in yms])
for y, yms in groupby(years, itemgetter('year'))
]
Сначала мы получаем данные из базы данных, а затем обрабатываем их, создавая список из двух кортежей, где первый элемент содержит год, а второй - список месяцев для этого года.