select_related query not example django annotations count django-queryset

example - not in django query



Django Count() en mĂșltiples anotaciones (2)

Creo que Count(''topics'', distinct=True) debería hacer lo correcto. Eso usará COUNT(DISTINCT topic.id) lugar de COUNT(topic.id) para evitar duplicados.

User.objects.filter( username_startswith="ab").annotate( posts=Count(''post'', distinct=True)).annotate( topics=Count(''topic'', distinct=True)).values_list( "username","posts", "topics")

Digamos que tengo un modelo de foro simple:

class User(models.Model): username = models.CharField(max_length=25) ... class Topic(models.Model): user = models.ForeignKey(User) ... class Post(models.Model): user = models.ForeignKey(User) ...

Ahora diga que quiero ver cuántos temas y publicaciones tiene cada usuario del subconjunto de usuarios (por ejemplo, su nombre de usuario comienza con "ab").

Entonces, si hago una consulta para cada publicación y tema:

User.objects.filter(username_startswith="ab") .annotate(posts=Count(''post'')) .values_list("username","posts")

Yeilds:

[(''abe'', 5),(''abby'', 12),...]

y

User.objects.filter(username_startswith="ab") .annotate(topics=Count(''topic'')) .values_list("username","topics")

Rendimientos:

[(''abe'', 2),(''abby'', 6),...]

SIN EMBARGO , cuando intento anotar ambos para obtener una lista, obtengo algo extraño:

User.objects.filter(username_startswith="ab") .annotate(posts=Count(''post'')) .annotate(topics=Count(''topic'')) .values_list("username","posts", "topics")

Rendimientos:

[(''abe'', 10, 10),(''abby'', 72, 72),...]

¿Por qué los temas y las publicaciones se multiplican juntas? Esperaba esto:

[(''abe'', 5, 2),(''abby'', 12, 6),...]

¿Cuál sería la mejor manera de obtener la lista correcta?


Intente agregar distinto a su último conjunto de preguntas:

User.objects.filter( username_startswith="ab").annotate( posts=Count(''post'')).annotate( topics=Count(''topic'')).values_list( "username","posts", "topics").distinct()

Consulte https://docs.djangoproject.com/en/1.3/ref/models/querysets/#distinct para obtener más detalles, pero básicamente obtendrá filas duplicadas porque las anotaciones abarcan varias tablas.