Django group by添加不存在的选择

时间:2018-11-27 14:29:23

标签: django group-by

我有一个包含选择的模型字段:

 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

中添加那些甚至不包含0的内容。

例如如果表仅包含条目

 Id   |   redirection_type
 --------------------------
  1   |    'A'

然后annotate仅返回

 'A': 1

这当然是正常的,但我仍然希望得到结果中所有不存在的选择:

 {'A': 1, 'B': 0}

最简单的方法是什么?

1 个答案:

答案 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中进行进一步处理,那似乎是最简单的。