2017-05-14 67 views
0

我想創建一個查詢,我可以在屏幕上顯示每個類別的最後3個論壇帖子。這裏是我的模型機的安裝方式:每個組的限制n個結果 - Django queryset

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

正如@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

在這種情況下,您沒有手段,只能使用原始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

+1

我認爲作者的問題是假定只使用一個SQL請求獲取所有數據。否則,這項任務是微不足道的。你可以迭代類別,但這是顯而易見的解決方案,它會產生太多的查詢(對於小應用程序/站點來說不成問題,當你有一個高負載項目時,這是個大問題)。 –

相關問題