5

Ich verwende die allgemeine Ansicht object_list, um eine Reihe von Artikeln schnell aufzulisten. Jedem Artikel sind Kommentare beigefügt. Die Abfrage verwendet eine Annotation zu Count() die Anzahl der Kommentare und dann order_by() diese annotierte Nummer.Wie kann ich inaktive Kommentare von meiner annotierten Django-Abfrage filtern/ausschließen?

'queryset': Article.objects.annotate(comment_count=Count('comments')).order_by('-comment_count'), 

Die Kommentare sind Teil des django.contrib.comments Rahmen und über eine generische Beziehung zu dem Modell angebracht. Ich habe eine explizite umgekehrte Suche zu meinem Artikelmodell hinzugefügt:

class Article(models.Models): 
    ... 
    comments = generic.GenericRelation(Comment, content_type_field='content_type', object_id_field='object_pk') 

Das Problem ist, dies zählt "inaktive" Kommentare; diejenigen, die is_public=False oder is_removed=True haben. Wie kann ich inaktive Kommentare von der Zählung ausschließen?

Antwort

2

Die documentation for aggregations erklärt, wie dies zu tun ist. Sie benötigen einen filter Klausel zu verwenden, dafür, dass Sie es ausdrückte nach die annotate Klausel:

Article.objects.annotate(comment_count=Count('comments')).filter(
    comment__is_public=True, comment__is_removed=False 
).order_by('-comment_count') 
+0

würde nicht, dass Filter Artikel basierend auf, ob sie öffentlich/entfernt Kommentare? – Jiaaro

+0

Es scheint zu funktionieren, aber ich werde einige Nachforschungen anstellen, um sicherzustellen, was Jim nicht gesagt hat. – Soviut

+0

Eine Nebenwirkung, die ich bemerkte, ist, dass es NUR Artikel zurückgibt, die Kommentare haben, solche ohne sind ausgeschlossen. – Soviut

Verwandte Themen