itertools.groupby无法正确地按外键对django查询集进行分组

8aqjt8rx  于 2023-05-01  发布在  Go
关注(0)|答案(2)|浏览(81)

假设我有以下模型:

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不包含预期的数据。
例如,我有两个职位在数据库中,属于不同的类别。查询选择了所有类别,但在最后一个类别组中仅显示一个帖子。

bq3bfh9z

bq3bfh9z1#

这个怎么样:

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

这里还有一篇关于如何执行group_by注解的excellent文章。

iyr7buue

iyr7buue2#

您可以执行以下操作:

posts = Posts.objects.all()
posts_groupped = {post.category: list() for post in posts}

for post in posts:
    posts_groupped[post.category].append(post)

但是你的Category模型应该定义了哈希:

class Category(models.Model)
    ...
    def __hash__(self):
        return hash(self.title)  # title or any other Category attribute with uniqueness for avoiding hash collisions

相关问题