2010-08-08 5 views
36

Ich habe dieses Modell bekam:Erhalten Sie verschiedene Werte von Queryset durch Feld

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

Wenn ein Benutzer in einem mehrfach Besuche Tag, wie kann ich für eindeutige Zeilen filtern basiert auf dem IP-Bereich? (Ich möchte die eindeutigen Besuche für heute)

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

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

EDIT:

Ich sehe, dass ich verwenden kann:

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

eine ValuesQuerySet nur die IP-Felder zu erhalten. Jetzt sieht mein QuerySet wie folgt aus:

[{'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'}] 

Wie kann ich diese Filter für Einzigartigkeit, ohne die QuerySet Auswertung und unter den db Hit?

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

möglich Duplikat [Auswahl unterschiedlicher Werte aus einem Tabellenfeld] (http://stackoverflow.com/questions/2466496/select-distinct-values-from-a-table-field) –

Antwort

32

Was Sie wollen, ist:

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

Was dies bedeutet ist, alle ip_addresses bekommen und dann wird es die Anzahl der Primärschlüssel (auch bekannt als Anzahl der Zeilen) für jede IP-Adresse.

+2

Ich glaube nicht, dass ich total verstehe, annotieren. Wie Sie es geschrieben haben, hat mein ValuesQuerySet nun "n": 1 an jeden Eintrag angehängt. Ich bin mir nicht sicher, was das mir sagt? – Scott

+7

Das Problem ist wahrscheinlich Meta.Ordering - versuchen Sie dies 'Visit.objects.filter (stuff) .order_by(). Werte (" ip_address "). Annotate (n = models.Count (" pk "))' – Greg

+1

@Greg Vielen Dank Sie! Ich neu, dass die 'ordering' und' order_by() 'Probleme mit' distinct' verursachen, aber ich wusste nicht, wie man es löst - obwohl es in der QuerySet API docs unter ['order_by()'] (https://docs.djangoproject.com/de/dev/ref/models/queriesets/# order-by) "_Wenn keine Sortierung auf eine Abfrage angewendet werden soll, nicht einmal die Standardreihenfolge, rufen Sie' order_by() 'ohne Parameter auf._ " –

13

Mit Alex Antwort habe ich auch die n: 1 für jeden Artikel. Sogar mit einer distinct() Klausel.

Es ist komisch, weil dies die guten Stückzahlen ist die Rückkehr:

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

Aber wenn ich iterieren "Visit.objects.filter (Zeug) .values ​​(" ip_address "). Distinct()" Ich bekam viel mehr Einzelteile und einige Duplikate ...

EDIT:

Die Filterklausel verursacht wurde mir Sorgen. Ich filterte mit einem anderen Tabellenfeld und es wurde ein SQL-JOIN erstellt, der die verschiedenen Sachen durchbrach. Ich habe diesen Hinweis die Abfrage, um zu sehen, die wirklich verwendet wurden:

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

Ich kehrte dann die Klasse auf Hexe ich die Abfrage zu machen und um die Filter zu habe eine Verknüpfung, die nicht auf einem „Besuch“ angewiesen Ich würde.

hoffe, das hilft

+0

Ist das eine Frage oder eine Antwort? – User

+0

war es eine Art Ergänzung zu Alex Antwort. Ich habe es versucht, hatte das gleiche Problem als vfxcode, und dann habe ich warum gefunden. Also dachte ich, ich sollte meine Erkenntnisse teilen. 3 Jahre später, ich gebe zu, meine Antwort war ein bisschen chaotisch und ich verstehe, warum Sie das fragen;) –