Lorsque je demande au gestionnaire de modèle d'obtenir un objet, il augmente DoesNotExist
lorsqu'il n'y a pas d'objet correspondant.
go = Content.objects.get(name="baby")
Au lieu de DoesNotExist
, comment puis-je go
être à la None
place?
python
django
django-queryset
TIMEX
la source
la source
SomeModel.objects.filter(foo='bar').first()
cela renvoie la première correspondance, ou Aucun. Il n'échoue pas s'il y a plusieurs exemples commequeryset.get()
filter().first()
je pense que l'exception est la voie à suivre.Depuis django 1.6, vous pouvez utiliser la méthode first () comme ceci:
la source
À partir de django docs
Vous pouvez intercepter l'exception et lui attribuer
None
le départ.la source
Vous pouvez créer une fonction générique pour cela.
Utilisez ceci comme ci-dessous:
go sera None si aucune entrée ne correspondra sinon retournera l'entrée Content.
Remarque: Cela déclenche une exception MultipleObjectsReturned si plusieurs entrées sont retournées pour name = "baby"
la source
Vous pouvez le faire de cette façon:
Maintenant, la variable go peut être soit l'objet que vous voulez, soit None
Réf: https://docs.djangoproject.com/en/1.8/ref/models/querysets/#django.db.models.query.QuerySet.first
la source
Pour faciliter les choses, voici un extrait du code que j'ai écrit, basé sur les entrées des merveilleuses réponses ici:
Et puis dans votre modèle:
C'est tout. Vous avez maintenant MyModel.objects.get () ainsi que MyModel.objetcs.get_or_none ()
la source
vous pouvez utiliser
exists
avec un filtre:juste une alternative pour si vous voulez seulement savoir si elle existe
la source
Note: If you only want to determine if at least one result exists (and don’t need the actual objects), it’s more efficient to use exists().
exists()
sera utilisé avec laif
clause avant de récupérer l'objet, provoquant ainsi un double coup sur la base de données. Je garderai toujours le commentaire au cas où cela aiderait quelqu'un d'autre.La gestion des exceptions à différents points de vos vues peut être très compliquée ... Qu'en est-il de la définition d'un gestionnaire de modèles personnalisé, dans le fichier models.py, comme
puis l'inclure dans la classe de modèle de contenu
De cette façon, il peut être facilement traité dans les vues à savoir
la source
return self.get(**kwargs)
le faire fonctionner pour moi. Pour ne rien dire de mal avec la réponse, juste un conseil pour quiconque essaie de l'utiliser avec des versions ultérieures (ou avec quoi que ce soit d'autre l'empêchant de fonctionner pour moi).C'est l'une de ces fonctions ennuyeuses que vous ne voudrez peut-être pas réimplémenter:
la source
get_object_or_None
mais j'ai constaté qu'il augmentait toujoursMultipleObjectsReturned
si plusieurs objets. Ainsi, l'utilisateur pourrait envisager d'entourer d'untry-except
(que la fonction elle-même atry-except
déjà).Si vous voulez une solution simple sur une seule ligne qui n'implique pas de gestion des exceptions, des instructions conditionnelles ou une exigence de Django 1.6+, faites-le à la place:
la source
Je pense que ce n'est pas une mauvaise idée d'utiliser
get_object_or_404()
Cet exemple équivaut à:
Vous pouvez en savoir plus sur get_object_or_404 () dans la documentation en ligne de django.
la source
À partir de django 1.7, vous pouvez faire comme:
L'avantage de "MyQuerySet.as_manager ()" est que les deux éléments suivants fonctionneront:
la source
Voici une variante de la fonction d'assistance qui vous permet de transmettre éventuellement une
QuerySet
instance, au cas où vous souhaitez obtenir l'objet unique (s'il est présent) à partir d'un ensemble de requêtes autre que l'ensemble deall
requêtes des objets du modèle (par exemple à partir d'un sous-ensemble d'éléments enfants appartenant à un instance parent):Cela peut être utilisé de deux manières, par exemple:
obj = get_unique_or_none(Model, **kwargs)
tel que discuté précédemmentobj = get_unique_or_none(Model, parent.children, **kwargs)
la source
Sans exception:
Utilisation d'une exception:
Il y a un peu d'argument sur le moment où il faut utiliser une exception en python. D'une part, "il est plus facile de demander pardon que de permission". Bien que je sois d'accord avec cela, je crois qu'une exception doit rester, eh bien, l'exception, et le «cas idéal» devrait fonctionner sans en toucher un.
la source
Nous pouvons utiliser l'exception intégrée de Django attachée aux modèles nommés comme
.DoesNotExist
. Nous n'avons donc pas à importer d'ObjectDoesNotExist
exception.Au lieu de cela:
Nous pouvons le faire:
la source
Il s'agit d'une copie de get_object_or_404 de Django, sauf que la méthode renvoie None. Ceci est extrêmement utile lorsque nous devons utiliser la
only()
requête pour récupérer uniquement certains champs. Cette méthode peut accepter un modèle ou un ensemble de requêtes.la source
Il vaut peut-être mieux utiliser:
la source