2017-03-05 1 views
0

Ich habe einen Beitrag Modell:Django erhalten Post Antworten

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 

Dies wird Frage- und Antwort-Website sein, genau wie SO. Wenn dieser Beitrag eine Frage ist, wird "is_question" wahr sein. sonst, wenn der Beitrag eine Antwort ist, 'Frage' Feld bezieht sich auf die ID des Beitrags, die die Frage ist und 'is_question' wird falsch sein.

einfach, richtig.

Jetzt versuche ich alle Fragen und die zugehörigen Antworten zu bekommen, ist das mit einer oder wenigen Abfragen möglich (ohne for-Schleife)?

Der folgende Filter wird die Fragen und einige verwandte Dinge zurückkehren nur (wie Anzahl der upvotes, Ansichten, Post-Tags):

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

Das ist sehr gut möglich. Erstellen Sie ein Fragenmodell mit einer Eigenschaft * Antworten *. Erstellen Sie dann ein Antwortmodell. Das lässt die Abfrage als Question.objects.all() – David

+0

Was befindet sich in dem Antwortfeld? eine durch Komma getrennte Liste von Antwort-IDs? – SMahdiS

Antwort

0

ich endlich die Lösung gefunden. Es ist bereits ein post_set-Objekt verfügbar Ich habe es überprüft und es waren die Antworten (ich denke, es liegt an Frage Eigenschaft im Modell).

Das ist also die letzte Abfrage:

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()