Django group by Choice Field and COUNT Zeros



考虑以下django模型:

class Image(models.Model):
image_filename = models.CharField(max_length=50)
class Rating(models.Model):
DIMENSIONS = [
('happy', 'happiness'),
('competence', 'competence'),
('warm_sincere', 'warm/sincere'),
]
rating_value = models.IntegerField(),
rating_dimension = models.CharField(max_length=50, choices=DIMENSIONS),
image = models.ForeignKey(Image, on_delete=models.CASCADE)

现在,我想按照每个类别的评级数量对所有评级进行分组,如下所示:

Rating.objects.values("rating_dimension").annotate(num_ratings=Count("rating_value"))

返回如下的QuerySets:

[{'rating_dimension': 'happy', 'num_ratings': 2},
{'rating_dimension': 'competence', 'num_ratings': 5}]

是否有办法包括所有非额定尺寸?实现如下输出:

[{'rating_dimension': 'happy', 'num_ratings': 2},
{'rating_dimension': 'competence', 'num_ratings': 5},
{'rating_dimension': 'warm_sincere', 'num_ratings': 0}] # ← zero occurrences should be included.

首先,我们将创建一个字典,将所有维度的计数初始化为0。

results = {dimension[0]: 0 for dimension in Rating.DIMENSIONS}

接下来我们将查询数据库:

queryset = Rating.objects.values("rating_dimension").annotate(num_ratings=Count("rating_value"))

接下来我们将更新我们的结果字典:

for entry in queryset:
results.update({entry['rating_dimension']: entry['num_ratings']})

在模板中,我们可以通过{% for key, value in results.items %}遍历该字典。或者字典可以根据视图中的需要转换为任何合适的结构。

最新更新