2010-08-08 12 views
36

mam tego modelu:Get odrębne wartości queryset przez pola

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

If użytkownik odwiedza wiele razy w ciągu jednego dnia, jak można filtrować unikalnych wierszy opartych na polu ip? (Chcę unikalnych wizyt do dzisiaj)

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

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

EDIT:

widzę, że mogę używać:

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

dostać ValuesQuerySet z zaledwie pól IP. Teraz moja QuerySet wygląda następująco:

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

Jak można filtrować ten wyjątkowości bez oceny QuerySet i biorąc trafienie db?

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

możliwy duplikat [Wybierz różne wartości z pola tabeli] (http://stackoverflow.com/questions/2466496/select-distinct-values-from-a-table-field) –

Odpowiedz

32

Co chcesz to:

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

Co to robi to uzyskać wszystkie ip_addresses a następnie pobiera liczbę kluczy głównych (aka liczba wierszy) dla każdego adresu IP.

+2

Nie sądzę, że w pełni rozumiem adnotację. Kiedy to napisałeś, mój ValuesQuerySet ma teraz "n": 1 dołączony do każdego wpisu. Nie jestem pewien, co mi to mówi? – Scott

+7

Problemem jest prawdopodobnie Meta.ordering - spróbuj tego 'Visit.objects.filter (stuff) .order_by(). Values ​​(" ip_address "). Adnotate (n = models.Count (" pk "))' – Greg

+1

@Greg Thank ty! Jestem nowy, że 'ordering' i' order_by() 'powoduje problemy z' distinct', ale nie wiem jak to rozwiązać - chociaż jest w dokumentach API QuerySet pod ['order_by()'] (https://docs.djangoproject.com/en/dev/ref/models/querysets/# order-by) "_Jeśli nie chcesz, aby jakiekolwiek zamówienia były stosowane do zapytania, nawet domyślna kolejność, wywołaj' order_by() 'bez parametrów ._ " –

13

Z Alex Odpowiedź Mam również n: 1 dla każdej pozycji. Nawet z klauzulą ​​distinct().

To dziwne, ponieważ jest to powrót dobrych numerów przedmiotów:

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

Ale kiedy iteracyjne nad "Visit.objects.filter (stuff) .values ​​(" ip_address "). Wyraźny()" I dostał dużo więcej elementów i niektóre duplikaty ...

EDIT:

klauzula filtr powodując mnie kłopoty. Filtowałem z innym polem tabeli i utworzono SQL JOIN, który przełamał różne rzeczy. użyłem tego wskazówkę, aby zobaczyć, że zapytanie zostało rzeczywiście wykorzystane:

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

Potem powrócił klasę na czarownicę robiłem kwerendy i filtr mieć przyłączyć, który nie opiera się na żadnym „Wizyta” ID.

nadzieję, że to pomaga

+0

Czy to jest pytanie lub odpowiedź? – User

+0

to był rodzaj uzupełnienia odpowiedzi Alex. Próbowałem, miałem ten sam problem niż vfxcode, a następnie znalazłem dlaczego. Więc pomyślałem, że powinienem podzielić się swoimi odkryciami. 3 lata później, przyznaję, że moja odpowiedź była trochę nieporządna i rozumiem, dlaczego pytasz;) –