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 ?

19voto

Moti Radomski Points 30

Pour faciliter les choses, voici un extrait du code que j'ai écrit, en me basant sur les contributions des merveilleuses réponses ici :

class MyManager(models.Manager):

    def get_or_none(self, **kwargs):
        try:
            return self.get(**kwargs)
        except ObjectDoesNotExist:
            return None

Et puis dans votre modèle :

class MyModel(models.Model):
    objects = MyManager()

C'est ça. Vous avez maintenant MyModel.objects.get() ainsi que MyModel.objetcs.get_or_none()

15voto

Ryan Saxe Points 2664

Vous pourriez utiliser exists avec un filtre :

Content.objects.filter(name="baby").exists()
#returns False or True depending on if there is anything in the QS

juste une alternative pour si vous voulez seulement savoir si elle existe

9voto

mknecht Points 822

C'est l'un de ces fonctions gênantes que vous ne voudrez peut-être pas réimplémenter :

from annoying.functions import get_object_or_None
#...
user = get_object_or_None(Content, name="baby")

8voto

Jonathan Souza Points 81

Peut-être que c'est mieux que tu utilises :

User.objects.filter(username=admin_username).exists()

7voto

Darwesh Points 417

La gestion des exceptions à différents endroits de vos vues pourrait être très lourde Que diriez-vous de définir un gestionnaire de modèles personnalisé, dans le fichier models.py, comme suit

class ContentManager(model.Manager):
    def get_nicely(self, **kwargs):
        try:
            return self.get(kwargs)
        except(KeyError, Content.DoesNotExist):
            return None

puis de l'inclure dans la classe Modèle de contenu

class Content(model.Model):
    ...
    objects = ContentManager()

De cette façon, il peut être facilement traité dans les vues, c'est-à-dire

post = Content.objects.get_nicely(pk = 1)
if post:
    # Do something
else:
    # This post doesn't exist

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