2017-05-14 5 views
0

私は、画面に表示されるカテゴリごとに最後の3つのフォーラム投稿を引っ張ることができるクエリを作成しようとしています。グループごとの結果の制限 - Djangoクエリーセット

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] 

だから私は最初のAに属しているすべてのカテゴリをつかむここに私のモデルが設定される方法がありますこれらのカテゴリを各カテゴリの最新の3つの投稿と一緒にリストしたいと思います。

答えて

2

が、小さな変更:

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

残念ながら、あなたが原因このチケットに今のDjangoのORMでこれを表現することはできません

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のものを使用している場合は必要とされている:言わ@expratorとしてProvide a way to manage grouping with RawSQL

+1

私は、著者の質問は、ただ1つのSQL要求を使用してすべてのデータをフェッチすると仮定していると考えました。それ以外の場合、タスクは簡単です。カテゴリを反復することはできますが、それは明らかな解決策であり、クエリが多すぎます(小さなアプリケーション/サイトでは問題ではなく、負荷の高いプロジェクトでは大きな問題です)。 –

関連する問題