Django-Prüfung für eine Abfrage

Antworten:

85

Verwendung count():

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

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

Der Vorteil gegenüber zB len()ist, dass das QuerySet noch nicht ausgewertet wird:

count()führt einen Blick SELECT COUNT(*)hinter die Kulissen aus, daher sollten Sie immer den count() gesamten Datensatz verwenden, anstatt ihn in Python-Objekte zu laden und len() das Ergebnis aufzurufen .

Vor diesem Hintergrund kann es sich lohnen , wenn QuerySets ausgewertet werden.


Wenn Sie get()z. B. verwenden scorm.objects.get(pk=someid)und das Objekt nicht vorhanden ist, wird eine ObjectDoesNotExistAusnahme ausgelöst:

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

Update: Es ist auch möglich zu verwenden exists():

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

Gibt zurück, Trueob das QuerySet Ergebnisse enthält, und Falsewenn nicht. Dadurch wird versucht, die Abfrage auf einfachste und schnellste Weise durchzuführen, es wird jedoch fast dieselbe Abfrage wie bei einer normalen QuerySet-Abfrage ausgeführt.

Felix Kling
quelle
51
if scorm.objects.filter(Header__id=qp.id).exists()
Alexander Lebedev
@ Alex Lebedev: Ja, diese Methode wird in Django 1.2 verfügbar sein. Danke dir.
Felix Kling
182

Ab Django 1.2 können Sie Folgendes verwenden exists():

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

if some_queryset.filter(pk=entity_id).exists():
    print("Entry contained in queryset")
sdornan
quelle
25
Dies sollte die akzeptierte Antwort sein. exist () ist in der Regel deutlich schneller als count ().
Frmdstryr
Es scheint auch schneller zu sein als die .objects.get(pk=...)Route
Brad Solomon