Django vérifie s'il existe une requête

Réponses:

87

Utilisez count():

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

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

L'avantage par rapport à par exemple len()est que le QuerySet n'est pas encore évalué:

count()effectue une SELECT COUNT(*)analyse des coulisses, vous devez donc toujours utiliser count() plutôt que de charger tout l'enregistrement dans des objets Python et appeler len() le résultat.

En gardant cela à l'esprit, lorsque les QuerySets sont évalués, cela vaut la peine d'être lu.


Si vous utilisez get(), par exemple scorm.objects.get(pk=someid), et que l'objet n'existe pas, une ObjectDoesNotExistexception est déclenchée:

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

Mise à jour: il est également possible d'utiliser exists():

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

Renvoie Truesi le QuerySet contient des résultats, et Falsesinon. Cela tente d'exécuter la requête de la manière la plus simple et la plus rapide possible, mais il exécute presque la même requête qu'une requête QuerySet normale.

Félix Kling
la source
51
if scorm.objects.filter(Header__id=qp.id).exists()
Alexander Lebedev
@Alex Lebedev: Oui, cette méthode sera disponible dans Django 1.2. Merci.
Felix Kling
183

Depuis Django 1.2, vous pouvez utiliser 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
la source
25
Cela devrait être la réponse acceptée. exist () est généralement beaucoup plus rapide que count ().
frmdstryr
1
Cela semble aussi être plus rapide que la .objects.get(pk=...)route
Brad Solomon
0

cela a fonctionné pour moi!

if some_queryset.objects.all (). exists (): print ("cette table n'est pas vide")

i_m_brunda
la source