Django sprawdza, czy istnieje jakieś zapytanie

Odpowiedzi:

87

Zastosowanie count():

sc=scorm.objects.filter(Header__id=qp.id)

if sc.count() > 0:
   ...

Zaletą nad np. len()Jest to, że zestaw QuerySet nie jest jeszcze oceniany:

count()wykonuje SELECT COUNT(*)za kulisami, więc powinieneś zawsze używać count() zamiast ładować cały rekord do obiektów Pythona i wywoływać len() wynik.

Mając to na uwadze, warto przeczytać , kiedy QuerySets są oceniane .


Jeśli użyjesz get()np scorm.objects.get(pk=someid), a obiekt nie istnieje, ObjectDoesNotExistzostanie zgłoszony wyjątek:

from django.core.exceptions import ObjectDoesNotExist
try:
    sc = scorm.objects.get(pk=someid)
except ObjectDoesNotExist:
    print ...

Aktualizacja: można również użyć exists():

if scorm.objects.filter(Header__id=qp.id).exists():
    ....

Zwraca, Truejeśli QuerySet zawiera jakiekolwiek wyniki, a Falsejeśli nie. To próbuje wykonać zapytanie w najprostszy i najszybszy możliwy sposób , ale wykonuje prawie to samo zapytanie, co zwykłe zapytanie QuerySet.

Felix Kling
źródło
51
if scorm.objects.filter(Header__id=qp.id).exists()
Alexander Lebedev
@Alex Lebedev: Tak, ta metoda będzie dostępna w Django 1.2. Dziękuję Ci.
Felix Kling
183

Od wersji Django 1.2 możesz używać exists():

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

if some_queryset.filter(pk=entity_id).exists():
    print("Entry contained in queryset")
sdornan
źródło
25
To powinna być akceptowana odpowiedź. exist () jest generalnie znacznie szybsza niż count ().
frmdstryr
1
Wydaje się też szybszy niż .objects.get(pk=...)trasa
Brad Solomon
0

to działało dla mnie!

if some_queryset.objects.all (). exist (): print ("ta tabela nie jest pusta")

i_m_brunda
źródło