es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Anotar en un Queryset distintivo de Django ya no utiliza el queryset distintivo.

Tengo una consulta y estoy tratando de anotar el recuento de cada valor para el campo tail_tip. Mi consulta original filtra en una tabla relacionada, por lo que es necesario usar distinct().
No estoy exactamente seguro de cómo describirlo, pero parece que cuando anoto la consulta distinta, la consulta deja de ser distinta. Aquí están las consultas con las que estoy probando en mi shell.

// Sin distinct()
Ski.objects.filter(published=True, size__in=[178, 179, 180, 181, 182, 183, 184]).count()
// 318
skis = Ski.objects.filter(published=True, size__in=[178, 179, 180, 181, 182, 183, 184]).distinct()
skis.count()
// 297
skis.values('tail_tip').order_by('tail_tip').annotate(count=Count('tail_tip'))
// <queryset [{'tail_tip':="" 'flat',="" 'count':="" 99},="" {'tail_tip':="" 'full_twin',="" 'count':="" 44},="" {'tail_tip':="" 'partial_twin',="" 'count':="" 175}]="">
// recuento total = 318

Dado que ‘skis’ ya es distinct(), no sé por qué cuando lo anoto el recuento total es igual a la consulta no distinta.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema podría estar relacionado con el hecho de que distinct() solo tiene en cuenta los campos utilizados en la consulta, no los añadidos a través de annotate(). En este caso, cuando agregas annotate(count=Count('tail_tip')) se crea un nuevo campo en la consulta, lo que podría resultar en duplicados ya que cada valor de tail_tip se está contando por separado sin importar su singularidad en la consulta original. Para solucionar este problema, podrías intentar usar distinct('tail_tip') en lugar de distinct() para asegurarte de que solo se estén considerando valores únicos del campo tail_tip al utilizar annotate(count=Count('tail_tip')). Esto debería darte el resultado esperado y evitar duplicados.

Comments are closed.