我有一个包含选择的模型字段:
db_redirection_choices = (('A', 'first'), ('B', 'second'))
redirection_type = models.CharField(max_length=256, choices=db_redirection_choices, blank=True, null=True)
有时候,我会在该列上进行分组,并计算所有现有选择:
results = stats.values('redirection_type').annotate(amount=Count('redirection_type')).order_by('redirection_type')
但是,这只会给我现有选择的结果。我想在results
例如如果表仅包含条目
Id | redirection_type
--------------------------
1 | 'A'
然后annotate
仅返回
'A': 1
这当然是正常的,但我仍然希望得到结果中所有不存在的选择:
{'A': 1, 'B': 0}
最简单的方法是什么?
答案 0 :(得分:1)
除了使用a conditional expression之外,我认为没有一种简单的方法可以使用ORM进行操作,但是我认为这会使查询变得更加复杂。
为什么不使用Python进行简单的后处理?
db_redirection_choices = (('A', 'first'), ('B', 'second'))
# I think your queryset will have a similar shape
results = [{'redirection_type': 'A', 'amount': 1}]
results_map = {
**{choice: 0 for choice, _display in db_redirection_choices},
**{res['redirection_type']: res['amount'] for res in results}
}
assert results_map == {'A': 1, 'B': 0}
如果您不需要在ORM中进行进一步处理,那似乎是最简单的。