327 votes

Comment obtenir l'objet s'il existe, ou None s'il n'existe pas dans Django ?

Lorsque je demande au gestionnaire de modèle d'obtenir un objet, il soulève la question suivante DoesNotExist lorsqu'il n'y a pas d'objet correspondant.

go = Content.objects.get(name="baby")

Au lieu de DoesNotExist comment puis-je avoir go être None à la place ?

445voto

Arthur Debert Points 3632

Il n'y a pas de moyen intégré de le faire. Django lèvera l'exception DoesNotExist à chaque fois. La façon idiomatique de gérer cela en Python est de l'envelopper dans un try catch :

try:
    go = SomeModel.objects.get(foo='bar')
except SomeModel.DoesNotExist:
    go = None

Ce que j'ai fait, c'est de sous-classer models.Manager, de créer un safe_get comme le code ci-dessus et utiliser ce gestionnaire pour mes modèles. De cette façon, vous pouvez écrire : SomeModel.objects.safe_get(foo='bar') .

274voto

FeroxTL Points 2123

Depuis django 1.6, vous pouvez utiliser premier() de la manière suivante :

Content.objects.filter(name="baby").first()

50voto

Amarghosh Points 33957

Extrait de la documentation de django

get() soulève un DoesNotExist exception si un objet n'est pas trouvé pour les paramètres donnés. Cette exception est également un attribut de la classe modèle. L'adresse DoesNotExist L'exception hérite de django.core.exceptions.ObjectDoesNotExist

Vous pouvez attraper l'exception et assigner None pour y aller.

from django.core.exceptions import ObjectDoesNotExist
try:
    go  = Content.objects.get(name="baby")
except ObjectDoesNotExist:
    go = None

46voto

Ranju R Points 131

Vous pouvez créer une fonction générique pour cela.

def get_or_none(classmodel, **kwargs):
    try:
        return classmodel.objects.get(**kwargs)
    except classmodel.DoesNotExist:
        return None

Utilisez-le comme ci-dessous :

go = get_or_none(Content,name="baby")

go sera None si aucune entrée ne correspond, sinon l'entrée du contenu sera retournée.

Note : Cela soulèvera une exception MultipleObjectsReturned si plus d'une entrée est retournée pour name="baby" .

Vous devriez le gérer dans le modèle de données pour éviter ce type d'erreur, mais vous pouvez préférer l'enregistrer au moment de l'exécution comme ceci :

def get_or_none(classmodel, **kwargs):
    try:
        return classmodel.objects.get(**kwargs)
    except classmodel.MultipleObjectsReturned as e:
        print('ERR====>', e)

    except classmodel.DoesNotExist:
        return None

21voto

Gaurav Points 773

Vous pouvez le faire de cette façon :

go  = Content.objects.filter(name="baby").first()

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

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