2017-03-05 9 views
0

私はPostモデルを持っている:これはちょうどSOのように、質問と回答のサイトになるだろうジャンゴ取得ポスト答え

class Post(models.Model): 
    poster = models.ForeignKey('auth.User') 
    question = models.ForeignKey('self', null=True, blank=True) 

    post_title = models.CharField(max_length=300) 
    post_content = models.TextField(null=True, blank=True) 

    is_question = models.BooleanField(default=True) 
    . 
    . 
    . 
    created_date = models.DateTimeField(
    default=timezone.now) 

    def __str__(self): 
     return self.post_title 

この投稿は質問の場合は 'is_question'となります。 投稿が回答の場合、 '質問'フィールドは質問の投稿のIDを参照し、 'is_question'は偽になります。

シンプル、右。

すべての質問とそれに関連する回答を得ようとしていますが、これは1つまたは複数のクエリで可能ですか(ループを使用しないで)?

次のフィルタは、(upvotesの数、ビュー、ポストタグのような)だけの質問といくつかの関連のものを返します。

posts = Post.objects.filter(
    created_date__lte=timezone.now(), 
    is_question=1, 
    is_published=1 
).order_by(
    '-created_date', 
).prefetch_related(
    Prefetch('vote_set', queryset=Vote.objects.filter(
     user=request.user, date_voted__gte=dt_aware), to_attr='user_voted') 
).prefetch_related(
    Prefetch('tags', to_attr='tagss') 
).annotate(total_votes=Coalesce(Sum('vote__vote_type'),0) 
).annotate(views_num = Count('questionvieaw', distinct=True) 
).select_related() 
+0

。プロパティ* answers *を持つ質問モデルを作成します。次に、回答モデルを作成します。その結果、質問はQuestion.objects.all()として残されます – David

+0

回答フィールドの内容は何ですか?アンサーIDのコンマ区切りリスト – SMahdiS

答えて

0

私が最終的に解決策を見つけました。利用可能なpost_setオブジェクトがすでにあります。それをチェックして答えました(モデルのの質問のプロパティによるものだと思います)。

これが最後のクエリです:これは非常に可能性がある

posts = Post.objects.filter(
    created_date__lte=timezone.now(), 
    is_question=1, 
    is_published=1 
).order_by(
    '-created_date', 
).prefetch_related(
    Prefetch('vote_set', queryset=Vote.objects.filter(
     user=request.user, date_voted__gte=dt_aware), to_attr='user_voted') 
).prefetch_related(
    Prefetch('post_set', queryset=Post.objects.filter(
     is_question=0), to_attr='answers') 
).prefetch_related(
    Prefetch('tags', to_attr='tagss') 
).annotate(total_votes=Coalesce(Sum('vote__vote_type'),0) 
).annotate(views_num = Count('questionvieaw', distinct=True) 
).select_related() 
関連する問題