web-dev-qa-db-fra.com

Vérification de la requête vide dans Django

Quel est l'idiome recommandé pour vérifier si une requête a donné des résultats?
Exemple:

orgs = Organisation.objects.filter(name__iexact = 'Fjuk inc')
# If any results
    # Do this with the results without querying again.
# Else, do something else...

Je suppose qu'il existe différentes manières de vérifier cela, mais j'aimerais savoir comment un utilisateur expérimenté de Django le ferait ... La plupart des exemples de la documentation ignorent simplement le cas où rien n'a été trouvé ...

132
Niklas
if not orgs:
    # Do this...
else:
    # Do that...
143
Adam

Depuis la version 1.2, Django utilise la méthode QuerySet .existe (), la plus efficace:

if orgs.exists():
    # Do this...
else:
    # Do that...

Mais si vous voulez évaluer QuerySet de toute façon, il vaut mieux utiliser:

if orgs:
   ...

Pour plus d'informations lisez la documentation QuerySet.exists () .

160

Si vous avez un grand nombre d'objets, cela peut (parfois) être beaucoup plus rapide:

try:
    orgs[0]
    # If you get here, it exists...
except IndexError:
    # Doesn't exist!

Sur un projet sur lequel je travaille avec une énorme base de données, not orgs est égal à 400 ms et orgs.count() à 250 ms. Dans mes cas d'utilisation les plus courants (ceux où il y a des résultats), cette technique le réduit souvent à moins de 20 ms. (Un cas que j'ai trouvé, c'était 6.)

Peut-être beaucoup plus long, bien sûr, en fonction de la distance à laquelle la base de données doit chercher pour obtenir un résultat. Ou même plus vite, s'il en trouve un rapidement; YMMV.

EDIT: Ceci sera sera souvent plus lent que orgs.count() si le résultat n’est pas trouvé, en particulier si la condition sur laquelle vous filtrez est rare; Par conséquent, il est particulièrement utile dans les fonctions de vue où vous devez vous assurer que la vue existe ou lance Http404. (Où, espérons-nous, les gens demandent des URL qui existent le plus souvent.) 

15
Adam Playford

Pour vérifier le vide d'un queryset:

if orgs.exists():
    # Do something

ou vous pouvez rechercher le premier élément d'un ensemble de requêtes. S'il n'existe pas, il retournera None:

if orgs.first():
    # Do something
10
Tuss4

Le moyen le plus efficace (avant Django 1.2) est le suivant:

if orgs.count() == 0:
    # no results
else:
    # alrigh! let's continue...
6
Bartosz

Je suis en désaccord avec le prédicat

if not orgs:

CA devrait etre 

if not orgs.count():

J'avais le même problème avec un ensemble de résultats assez volumineux (environ 150 000 résultats). L'opérateur n'est pas surchargé dans QuerySet, le résultat est donc décompressé sous forme de liste avant la vérification. Dans mon cas, le temps d'exécution a été réduit de trois ordres.

5
hedleyroos

Vous pouvez aussi utiliser ceci:

if(not(orgs)): #if orgs is empty else: #if orgs is not empty

0
Rupesh Chaudhari