每组限制n个结果 - Django queryset

时间:2017-05-14 21:39:21

标签: python django django-models model

我正在尝试创建一个查询,我可以在屏幕上显示每个类别的最后3个论坛帖子。以下是我的模型设置方式:

class ForumCategory(models.Model):
    name = models.CharField(max_length=40)
    description = models.TextField()
    class_id = models.ForeignKey(Class)


class ForumPost(models.Model):
    name = models.CharField(max_length=100)
    details = models.TextField()
    author = models.ForeignKey(User)
    class_id = models.ForeignKey(Class)
    category = models.ForeignKey(ForumCategory)
    created_at = models.DateTimeField(auto_now_add=True)

我当前的查询一般会返回3个最新帖子,而不是每个类别3个:

categories = ForumCategory.objects.filter(class_id=class_id)
        forum_post = ForumPost.objects.filter(category_id__in=categories.values_list('id', flat=True)).order_by('-category_id')[:3]

所以我首先抓住属于特定类的所有类别,我想列出这些类别以及每个类别中最近的3个帖子。

2 个答案:

答案 0 :(得分:2)

正如@exprator所说,只是一个小小的改变,

categories = ForumCategory.objects.filter(class_id=class_id)
result_dict = {}
for cat in categories:
    forum_post = ForumPost.objects.filter(category__pk=cat.pk).order_by('-created')[:3]
    result_dict[cat.name] = forum_post

然后可以从相应的类别名称访问每个类别的查询集。

答案 1 :(得分:0)

在这种情况下,您无需使用原始SQL。如果您正在使用PostgreSQL,则需要这样的东西:

SELECT * FROM (SELECT *, row_number() OVER (PARTITION BY forum_category_id)  
FROM forum_post) x WHERE x.row_number <= 3;

不幸的是,由于此票证,您暂时无法在Django ORM中表达此信息:Provide a way to manage grouping with RawSQL