web-dev-qa-db-fra.com

Vérifier si un objet existe

J'ai besoin de vérifier si Model.objects.filter(...) a mis quoi que ce soit en place, mais je n'ai pas besoin d'insérer quoi que ce soit. Mon code jusqu'ici 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'])
39
sinθ

Puisque filter retourne une QuerySet, vous pouvez utiliser count pour vérifier le nombre de résultats renvoyés. En supposant que vous n’ayez pas 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 ultérieurement, car vous ne ferez qu'une requête SQL:

Un appel count () effectue un SELECT COUNT (*) en coulisse. Vous devez donc toujours utiliser count () plutôt que de charger tout l'enregistrement dans des objets Python et d'appeler len () sur le résultat (sauf si vous devez charger les objets. de toute façon dans la mémoire, auquel cas len () sera plus rapide).

num_results = len(user_object)
42
joneshf

Je pense que le plus simple d'un point de vue logique et efficace est d'utiliser la fonction n'existe () de queryset, documentée ici:

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

Donc, 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
80
mpaf

la valeur booléenne d'un QuerySet vide est également False, vous pouvez donc simplement le faire ...

...
if not user_object:
   do insert or whatever etc.
6
David Lam

Vous pouvez également utiliser get_object_or_404 () , il générera 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!
    ...
5
César

Vous pouvez utiliser:

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

si l'utilisateur existe, vous pouvez obtenir l'utilisateur dans l'objet_utilisateur, sinon l'objet_utilisateur sera nul.

try:
    user_object = User.objects.get(email = cleaned_info['username'])
except User.DoesNotExist:
    user_object = None
if user_object:
    # user exist
    pass
else:
    # user does not exist
    pass
1
paras chauhan