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.