Django: установить псевдоним для группы по полю (annotate) в Model.objects.filter - PullRequest
0 голосов
/ 28 января 2020

Когда при фильтрации по модели Django используется группировка по, как мы можем установить псевдоним / метку для порядка по полю в ответе?

now = datetime.now()

Attendance.objects.filter(member_id=user_id, date__gte=now.date()).values('attdate__week_day').annotate(
attendance_amount=Count('attdate__week_day'))

Это возвращает следующее.

{
"attdate__week_day": 2,
"attendance_amount": 2
}

В приведенном выше наборе результатов мне нужно изменить "date__week_day" на "day". Это возможно?

Ответы [ 2 ]

2 голосов
/ 28 января 2020

Вы можете использовать F expression в values() напрямую:

Attendance.objects.filter(member_id=user_id, date__gte=now.date()).values(day=F('attdate__week_day')).annotate(
attendance_amount=Count('day'))

Или ExtractWeekDay, если вам нужно извлечь только день недели:

Attendance.objects.filter(member_id=user_id, date__gte=now.date()).values(day=ExtractWeekDay('attdate')).annotate(
attendance_amount=Count('day'))
2 голосов
/ 28 января 2020

Да, используйте это:

Attendance.objects.filter(
    member_id=user_id, date__gte=now.date()
).annotate(
    day=F('date__week_day')
).values('day').annotate(
    attendance_amount=Count('day')
)
...