2012-07-07 12 views
7

Chciałbym policzyć liczbę przedmiotów zwróconych w moim queryset. Na przykładJak liczyć liczbę elementów w zapytaniu bez liczenia()

userdesigns = Design.objects.filter (desadder = user.id)

Chciałbym uzyskać liczbę obiekt zwrócony bez użyciu count().

Powodem jest to, że próbuję przyśpieszyć wydajność i zmniejszyć liczbę zapytań bazy danych, które wykonuję i zauważyłem, że za pomocą count() pinguje bazę danych, której nie chcę. Biorąc pod uwagę, że już wyciągnąłem kompletną liczbę projektów użytkownika, czy nie powinien istnieć sposób na zliczanie liczby elementów przechowywanych w tym zwróconym zestawie zapytań?

Odpowiedz

16

len(). QuerySet jest oceniany, gdy wywołasz na nim len(). To, jak można się spodziewać, zwraca długość listy wyników.

Uwaga: Nie należy używać funkcji len() w kwerendach, jeśli wszystko, co chcesz zrobić, to określić liczbę rekordów w zestawie. Jest o wiele bardziej wydajny, aby obsłużyć liczbę na poziomie bazy danych, używając SQL SELECT COUNT (*), , a Django udostępnia metodę count() z dokładnie tego powodu. Zobacz count() poniżej.

Source

Więc jeśli zadzwonisz len(userdesigns) zamiast userdesigns.count(), Django zwróci wszystkie powiązane dane z tabeli w jednym zapytaniu. Następnie możesz uzyskać dostęp do wszystkich elementów zmiennej userdesigns, bez dodatkowych zapytań.

>>> m = Model1.objects.filter(desadder=1) 
>>> len(m) 
(0.000) SELECT "app1_model1"."id", "app1_model1"."desadder", "app1_model1"."test" FROM "app1_model1" WHERE "app1_model1"."desadder" = 1 ; args=(1,) 
2 
>>> m[0] 
<Model1: Model1 object> 
>>> m = Model1.objects.filter(desadder=1) 
>>> len(m) 
(0.000) SELECT "app1_model1"."id", "app1_model1"."desadder", "app1_model1"."test" FROM "app1_model1" WHERE "app1_model1"."desadder" = 1 ; args=(1,) 
2 
>>> m[0] 
<Model1: Model1 object> 
>>> 
+0

Oh ciekawe. Więc mówisz, że zamiast uruchamiać moje zapytanie powyżej, zamiast tego mogę po prostu użyć 'len()' z get-go i wszystkie elementy w 'userdesigns' pojawią się na tej przejażdżce? – user1328021

+0

Tak. Dodałem przykład z powłoki django. –

+1

"Powodem jest to, że próbuję przyśpieszyć wydajność i zmniejszyć liczbę zapytań do bazy danych, które wykonuję" =>, a następnie naucz się używać "Queryset.select_related". –

0

Riateche odpowiedział, ale jeśli nie chcesz używać len() lub .count() bezpośrednio na queryset, można zwrócić values_list i używać len() na nim.

dokumentacji Django mówi:

https://docs.djangoproject.com/en/dev/ref/models/querysets/

ValuesQuerySet jest przydatna, gdy wiesz, że tylko będzie trzeba wartości od niewielkiej liczby dostępnych pól i nie trzeba będzie funkcjonalność obiektu instancji modelu.

Wątpię, czy jest to szybsze, ale zawsze można je obejść i zobaczyć. Może to być przydatne, jeśli chcesz tylko zwrócić podzbiór wszystkich dostępnych pól w tabeli.

Powiązane problemy