Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django group by Choice字段和计数零_Python_Django_Django Models_Group By_Django Orm - Fatal编程技术网

Python Django group by Choice字段和计数零

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 =

考虑以下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"))
返回如下查询集:

[{'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维…