select_related queryset example cual consultas avanzadas django field distinct django-queryset

django - example - Obtenga valores distintos de Queryset por campo



group by django (2)

Tengo este modelo:

class Visit(models.Model): timestamp = models.DateTimeField(editable=False) ip_address = models.IPAddressField(editable=False)

Si un usuario visita varias veces en un día, ¿cómo puedo filtrar las filas únicas basadas en el campo de IP? (Quiero las visitas únicas para hoy)

today = datetime.datetime.today() yesterday = datetime.datetime.today() - datetime.timedelta(days=1) visits = Visit.objects.filter(timestamp__range=(yesterday, today)) #.something?

EDITAR:

Veo que puedo usar:

Visit.objects.filter(timestamp__range=(yesterday, today)).values(''ip_address'')

para obtener un ValuesQuerySet de solo los campos de ip. Ahora mi QuerySet se ve así:

[{''ip_address'': u''127.0.0.1''}, {''ip_address'': u''127.0.0.1''}, {''ip_address'': u''127.0.0.1''}, {''ip_address'': u''127.0.0.1''}, {''ip_address'': u''127.0.0.1''}]

¿Cómo puedo filtrar esto por unicidad sin evaluar el QuerySet y tomar el hit de db?

# Hope it''s something like this... values.distinct().count()


Con Alex Answer también tengo n: 1 para cada artículo. Incluso con una cláusula distinct ().

Es extraño porque esto devuelve los buenos números de artículos:

Visit.objects.filter(stuff).values("ip_address").distinct().count()

Pero cuando repito "Visit.objects.filter (stuff) .values ​​(" ip_address "). Distinct ()" Obtuve muchos más elementos y algunos duplicados ...

EDITAR:

La cláusula de filtro me estaba causando problemas. Estaba filtrando con otro campo de tabla y se realizó una JOIN de SQL que estaba rompiendo las cosas distintas. Utilicé esta sugerencia para ver la consulta que realmente se usó:

q=Visit.objects.filter(myothertable__field=x).values("ip_address").distinct().count() print q.query

Luego revertí la clase en la que estaba haciendo la consulta y el filtro para tener una unión que no depende de ninguna identificación de "Visita".

espero que esto ayude


Lo que quieres es:

Visit.objects.filter(stuff).values("ip_address").annotate(n=models.Count("pk"))

Lo que esto hace es obtener todas las direcciones_IP y luego obtiene el recuento de las claves primarias (también conocido como número de filas) para cada dirección IP.