2010-09-25 13 views
6

Mam zapytanie, które w zasadzie "zlicza wszystkie elementy typu X i zwraca elementy, które istnieją więcej niż jeden raz, wraz z ich liczbą". Teraz mam to:Filtrowanie na liczniku z Django ORM

Item.objects.annotate(type_count=models.Count("type")).filter(type_count__gt=1).order_by("-type_count") 

ale nic nie zwraca (liczba wynosi 1 dla wszystkich pozycji). Co ja robię źle?

Idealnie, należy uzyskać następujące:

Type 
---- 
1 
1 
2 
3 
3 
3 

i powrót:

Type, Count 
----------- 
1  2 
3  3 
+0

Czy możesz pokazać swoje modele? –

+0

Mogę, ale odpowiednim bitem jest po prostu model "przedmiotowy" z polem "typ" ... –

Odpowiedz

15

Aby zliczyć liczbę wystąpień każdego typu, należy pogrupować według pola type. W Django odbywa się to przy użyciu values, aby uzyskać tylko to pole. To powinno zadziałać:

Item.objects.values('group').annotate(
    type_count=models.Count("type") 
).filter(type_count__gt=1).order_by("-type_count") 
+0

tak - tak, ale użyj 'type' zamiast' group' :) Zwróci coś takiego: [{'type': u'X ',' type_count ': 2}] - dlaczego nie powiedziałem tego wcześniej :) – bx2

+0

Myślę, że miałeś na myśli "wpisz" zamiast "grupy", to * działało * kiedy robiłem to bez części __gt, ale z częścią __gt to po prostu wyrzuca "obiekt dict nie ma atrybutu type_count", który mówi mi, że próbuje uzyskać do niego dostęp w postaci kolumny ... –

+0

To dziwne - sprawdziłem to i działa jak urok. Btw. kiedy mówi o braku atrybutu type_count w dict, oznacza dykt generowany przez agregację - nie próbuje uzyskać dostępu do niej jak do kolumny. Wyniki powinny być takie, jak napisałem powyżej. Sprawdź to w powłoce django, aby się upewnić. – bx2

2

Jest to błąd logiczny;)

type_count__gt=1 oznacza type_count > 1 więc jeśli count == 1 nie będzie wyświetlany :) zamiast tego użyj type_count__gte=1 - oznacza type_count >= 1 :)

+0

Chcę tylko tych, którzy policzą * więcej * niż jeden, więc to prawda ... –

+0

tak, ale ty powiedział, że liczba jest równa 1 dla każdego - to jest powód, dla którego nic nie jest wyświetlane :) – bx2

+0

Istnieją zduplikowane typy, ale liczba dla wszystkiego wynosi 1. Jest źle, ale nie wiem, dlaczego liczba nie jest poprawna jeden. –

Powiązane problemy