Skip to main content
 首页 » 编程设计

python之限制每组 n 个结果之Django queryset

2024年08月20日24jackei

我正在尝试创建一个查询,我可以在其中提取屏幕上显示的每个类别的最后 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 个最新帖子。

请您参考如下方法:

在这种情况下,您别无选择,只能使用原始 SQL。如果您使用的是 PostgreSQL,则需要这样的东西:

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

不幸的是,由于这张票:Provide a way to manage grouping with RawSQL,您现在不能在 Django ORM 中表达它。