2010-08-08 11 views
36

Tengo este modelo:Obtener valores distintos de queryset por el campo

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

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

today = datetime.datetime.today() 
yesterday = datetime.datetime.today() - datetime.timedelta(days=1) 

visits = Visit.objects.filter(timestamp__range=(yesterday, today)) #.something? 

EDIT:

veo que puedo usar:

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

para obtener un ValuesQuerySet de sólo los campos de IP. Ahora mi QuerySet es el siguiente:

[{'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 filtro para esta singularidad sin evaluar la QuerySet y toma el tiro db?

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

posible duplicado de [Seleccionar valores distintos de un campo de tabla] (http://stackoverflow.com/questions/2466496/select-distinct-values-from-a-table-field) –

Respuesta

32

Lo que quiere decir:

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

Lo que esto hace es conseguir todos los ip_addresses y luego se pone el recuento de claves primarias (también conocido como número de filas) para cada dirección IP.

+2

No creo que entiendo totalmente anotar. Como lo escribió, mi ValuesQuerySet ahora tiene "n": 1 anexado a cada entrada. No estoy seguro de lo que eso me dice? – Scott

+7

El problema es probablemente Meta.ordering - prueba esto 'Visit.objects.filter (cosas) .order_by(). Values ​​(" dirección_ip "). Annotate (n = models.Count (" pk "))' – Greg

+1

@Greg Gracias ¡tú! Soy nuevo en que 'ordering' y' order_by() 'causan problemas con' distinct', pero no supe cómo resolverlo, aunque está en los documentos de la API QuerySet bajo ['order_by()'] (https://docs.djangoproject.com/en/dev/ref/models/querysets/# order-by) "_Si no desea que se aplique ningún pedido a una consulta, ni siquiera el orden predeterminado, llame a' order_by() 'sin parámetros._ " –

13

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

Es raro, porque esta es la devolución de los buenos números de artículos:

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

Pero cuando iterar sobre ".values ​​Visit.objects.filter (cosas) (" ip_address "). Distinta()" I tiene mucho más artículos y algunos duplicados ...

EDIT:

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 fue realmente utilizado:

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

luego volvieron a la clase de bruja que estaba haciendo la consulta y el filtro de tener una combinación que no se basa en ninguna "visita" carné de identidad.

esperanza esto ayuda

+0

¿Es esta una pregunta o una respuesta? – User

+0

era una especie de complemento a la respuesta de Alex. Lo intenté, tuve el mismo problema que vfxcode, y luego encontré por qué. Entonces pensé que debería compartir mis hallazgos. 3 años después, admito que mi respuesta fue un poco desordenada y entiendo por qué preguntas esto;) –

Cuestiones relacionadas