Python Django group by Choice字段和计数零
考虑以下django模型:Python Django group by Choice字段和计数零,python,django,django-models,group-by,django-orm,Python,Django,Django Models,Group By,Django Orm,考虑以下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 =
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"))
返回如下查询集:
[{'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%}
迭代此字典。或者字典可以根据需要在视图中转换为任何合适的结构。不太可能,但你只有3个选择,因此你可以简单地进行3次查询,或者找出哪个维度没有评级,然后自己添加一个0的条目(如果有更多选择,你可以使用循环)。@AbdulAzizBarkat当然有办法通过ORM实现这一点。例如,检查@schwobasegl,这是一个关系,检查问题,这是一个有选择的CharField。@AbdulAzizBarkat你是对的。如果没有特定选择的评级
,则db可能无法生成该评级。您的第二个建议是避免虚假db命中的方法。@AbdulAzizBarkat感谢您的评论,是的,for循环当然是可能的,我只是认为必须有更好的方法,示例仅显示了实际+20维中的3维…