假设我有以下模型:
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不包含预期的数据。
例如,我在数据库中有两个帖子,属于不同的类别。查询会选择所有类别,但仅选择最后一个类别组中显示的一个帖子。
这个呢:
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注释的优秀文章。
您可以执行以下操作:
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