5

Estoy usando la vista genérica object_list para enumerar rápidamente un conjunto de artículos. Cada artículo tiene comentarios adjuntos. La consulta utiliza una anotación a Count() la cantidad de comentarios y luego order_by() ese número anotado.¿Cómo se filtra/excluye los comentarios inactivos de mi consulta anotada Django?

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

Los comentarios son parte del marco django.contrib.comments y se adjuntan al modelo a través de una relación genérica. He agregado una búsqueda inversa explícita a mi modelo de artículo:

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

El problema es que esto cuenta los comentarios "inactivos"; los que tienen is_public=False o is_removed=True. ¿Cómo puedo excluir cualquier comentario inactivo de ser contado?

Respuesta

2

El documentation for aggregations explica cómo hacerlo. Es necesario utilizar una cláusula filter, asegurándose de que lo pones después de la cláusula annotate:

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

no querían que filtrar artículos en función de si tienen o no los comentarios públicos/retirados? – Jiaaro

+0

Parece que funcionó, pero voy a investigar un poco para asegurarme de que lo que dijo Jim no esté sucediendo. – Soviut

+0

Un efecto secundario que noté es que SOLAMENTE devuelve artículos que tienen comentarios, los que no están excluidos. – Soviut

Cuestiones relacionadas