【问题标题】:itertools.groupby can not group django queryset by a foreignkey correctlyitertools.groupby 无法正确地按外键对 django 查询集进行分组
【发布时间】:2019-01-30 01:41:00
【问题描述】:

假设我有以下模型:

class Category(models.Model):
    name = models.CharField(max_length=10)

class Post(models.Model):
    title = models.CharField(max_length=10)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)

然后,我想选择所有帖子并按类别分组:

from itertools import groupby
from operator import attrgetter

qs = Post.objects.all().select_related('category').order_by('category')
posts_group = groupby(qs, key=attrgetter('category'))

但是,posts_group 不包含预期的数据。

例如,我在数据库中有两个帖子,属于不同的类别。该查询确实选择了所有类别,但最后一个类别组中只显示了一个帖子。

【问题讨论】:

  • groupby 通过可迭代的方式按顺序工作。如果你想把所有相同的键收集在一起,你需要自己排序。
  • 查询已经按类别排序。
  • 您将不得不创建一个 minimal reproducible example 来证明您的问题。
  • 您忽略了展示您如何使用 groupby 可迭代(并且很多 人都搞错了,所以这非常重要;您的所描述的不当行为听起来很像您试图 listify 整件事,这是错误要做的事情)。请包含包含该代码的minimal reproducible example

标签: python django django-orm


【解决方案1】:

这个呢:

def groub_posts_by_cat():
    groups = {}
    categories = Post.objects.values('category')
    for cat in categories:
        groups.update({
            cat.name: Post.objects.filter(category__pk=cat.pk)
        })
    return groups

这里还有一篇excellent 文章,介绍如何执行 group_by 注释。

【讨论】:

  • 这个解决方案会非常迭代地影响数据库,不是一个好主意。
  • 此解决方案将只在categories = Post.objects.values('category') 行中的数据库中命中一次groups 字典中的值是尚未评估的查询集。
  • 这仍然很糟糕!你最好拉出所有帖子并将它们分组在内存中,而不是查询每个类别!
猜你喜欢
  • 2014-01-18
  • 2016-12-26
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 2019-08-19
  • 2013-04-05
  • 2015-03-09
相关资源
最近更新 更多