我想对给定用户的数据库中的所有项目进行计数,并根据时间戳将其分类为存储桶。
我有一本字典,它定义了一组这样的类别:
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