【发布时间】:2021-01-29 14:02:49
【问题描述】:
考虑以下 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
提前致谢!
【问题讨论】:
-
并非如此,但您只有 3 个选择,因此您可以简单地进行 3 个查询,或者找出未评级的维度并自己添加一个 0 条目(如果有更多选择,您可以使用循环)。
-
@AbdulAzizBarkat 当然可以通过 ORM 实现。检查例如this answer
-
@schwobaseggl 是一个关系,检查它是一个有选择的 CharField 的问题。
-
@AbdulAzizBarkat 你是对的。如果没有具有特定选择的
Rating,则数据库可能无法生成它。您的第二个建议是避免虚假数据库命中的方法。 -
@AbdulAzizBarkat 感谢您的评论,是的,for 循环当然是可能的,我只是认为必须有更好的方法,示例仅显示实际 +20 尺寸的 3 个......跨度>
标签: python django django-models group-by django-orm