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.