88 votes

Vérifier si un objet existe

Je dois vérifier si Model.objects.filter(...) n'ont pas besoin d'insérer quoi que ce soit. Mon code jusqu'à présent est :

user_pass = log_in(request.POST)  # form class
if user_pass.is_valid():
    cleaned_info = user_pass.cleaned_data
    user_object = User.objects.filter(email = cleaned_info['username'])

175voto

mpaf Points 650

Je pense que le plus simple d'un point de vue logique et de l'efficacité est d'utiliser la méthode de queryset existe() qui est documentée ici :

https://docs.djangoproject.com/en/stable/ref/models/querysets/#django.db.models.query.QuerySet.exists

Ainsi, dans votre exemple ci-dessus, j'écrirais simplement :

if User.objects.filter(email = cleaned_info['username']).exists():
    # at least one object satisfying query exists
else:
    # no object satisfying query exists

75voto

joneshf Points 2177

Desde filter renvoie un QuerySet vous pouvez utiliser compter pour vérifier combien de résultats ont été retournés. Cela suppose que vous n'avez pas réellement besoin des résultats.

num_results = User.objects.filter(email = cleaned_info['username']).count()

Après avoir consulté la documentation, il est préférable d'appeler simplement len sur votre filtre si vous prévoyez d'utiliser les résultats plus tard, car vous ne ferez qu'une seule requête sql :

Un appel count() exécute un SELECT COUNT(*) en arrière-plan. Vous devriez donc toujours utiliser count() plutôt que de charger tous les enregistrements dans des objets Python et d'appeler len() sur le résultat (sauf si vous devez charger les objets en mémoire de toute façon, auquel cas len() sera plus rapide).

num_results = len(user_object)

7voto

David Lam Points 1176

La valeur booléenne d'un QuerySet vide est également False, donc vous pourriez aussi simplement faire...

...
if not user_object:
   do insert or whatever etc.

6voto

César Bustíos Points 4505

Vous pouvez également utiliser get_object_ou_404() il soulèvera un Http404 si l'objet n'a pas été trouvé :

user_pass = log_in(request.POST) #form class
if user_pass.is_valid():
    cleaned_info = user_pass.cleaned_data
    user_object = get_object_or_404(User, email=cleaned_info['username'])
    # User object found, you are good to go!
    ...

4voto

acarayol Points 131

Vous pouvez utiliser :

try:
   # get your models
except ObjectDoesNotExist:
   # do something

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X