【问题标题】:Django group by Choice Field and COUNT ZerosDjango 按选择字段和 COUNT 个零分组
【发布时间】: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


【解决方案1】:

首先,我们将创建一个字典,其中所有维度的计数都初始化为 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 %} 遍历这个字典。或者可以根据视图中的需要将字典转换为任何合适的结构。

【讨论】:

    猜你喜欢
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 2020-05-26
    相关资源
    最近更新 更多