在Django中按年龄分组数据库结果

时间:2019-06-12 15:15:09

标签: python django django-queryset

我想对给定用户的数据库中的所有项目进行计数,并根据时间戳将其分类为存储桶。

我有一本字典,它定义了一组这样的类别:

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  | ...

基于this question,我尝试过:

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 Django 1.11.6

0 个答案:

没有答案