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.
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 deannotate()
. En este caso, cuando agregasannotate(count=Count('tail_tip'))
se crea un nuevo campo en la consulta, lo que podría resultar en duplicados ya que cada valor detail_tip
se está contando por separado sin importar su singularidad en la consulta original. Para solucionar este problema, podrías intentar usardistinct('tail_tip')
en lugar dedistinct()
para asegurarte de que solo se estén considerando valores únicos del campotail_tip
al utilizarannotate(count=Count('tail_tip'))
. Esto debería darte el resultado esperado y evitar duplicados.