2017-03-05 76 views
0

我有一個Post模型:Django的得到答案後

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 

這將是問答網站,就像SO。

如果這個職位是一個問題,'is_question'將成立。 否則,如果帖子是答案,'問題'字段將指的是帖子的id,而'is_question'將是錯誤的。

簡單,正確。

現在我試圖得到所有的問題和相關的答案,這可能與一個或幾個查詢(不使用for循環)?

以下過濾器將返回的問題和一些相關的東西只(如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

這是很有可能的。創建一個具有屬性*答案*的問題模型。然後創建一個答案模型。將查詢留作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()