Tyring для группировки результатов базы данных по возрасту в Джанго - PullRequest
1 голос
/ 12 июня 2019

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

У меня есть словарь, который определяет набор категорий, таких как:

age_categories = {'cat1': {'start': <timestamp>, 'end': <timestamp>}},
                 {'cat2': {'start': <timestamp>, 'end': <timestamp>}},
                 ...

Я хочу получить результат из базы данных, которая выглядит следующим образом:

User      | cat1 | cat2 | cat3 | ...
Joe Smith |   12 |    0 |   7  | ...
Bob Smith |    4 |    9 |  11  | ...

На основании этого вопроса , я пробовал:

age_query = [key=Count(Case(When(datefield__range=(val['start'], val['end']), then=1))) for key, val in age_categories.items()]
...
results = Table.objects.filter(...).values(...).annotate(*age_query)

но я не могу заставить это работать. Это дает мне неправильную синтаксическую ошибку в строке, где я определяю age_query.

Если я изменю запрос на список строк как

age_query = [key + "=Count(Case(When(datefield__range=('" + val['start'] + "', '" + val['end'] + "'), then=1)))" for key, val in age_categories.items()]

это говорит мне, что Complex annotations require an alias, когда предполагается, что ключом словаря должен быть псевдоним.

Это достижимо? Я знаю, как это сделать в сыром SQL, но я действительно предпочел бы использовать инструменты Django, если это вообще возможно.

Спасибо.

Python 3.6.5 Джанго 1.11.6

...