Pour ajouter un exemple de code à la réponse de sorki (je l'ajouterais bien en commentaire, mais c'est mon premier message, et je n'ai pas assez de réputation pour laisser des commentaires), j'ai implémenté un gestionnaire personnalisé get_or_none comme suit :
from django.db import models
class GetOrNoneManager(models.Manager):
"""Adds get_or_none method to objects
"""
def get_or_none(self, **kwargs):
try:
return self.get(**kwargs)
except self.model.DoesNotExist:
return None
class Person(models.Model):
name = models.CharField(max_length=255)
objects = GetOrNoneManager()
Et maintenant je peux le faire :
bob_or_none = Person.objects.get_or_none(name='Bob')
2 votes
Vous savez que vous pouvez simplement utiliser foo = foo[0] if foo else None
2 votes
Python possède un opérateur ternaire, vous n'avez pas besoin d'utiliser les opérateurs booléens. Aussi,
len(foo)
est mauvais : " Note : N'utilisez pas len() sur les QuerySets si tout ce que vous voulez faire est de déterminer le nombre d'enregistrements dans le jeu. Il est beaucoup plus efficace de gérer un comptage au niveau de la base de données, en utilisant la méthode SELECT COUNT() de SQL, et Django fournit une méthode count() précisément pour cette raison. ". Réécrit :foo = foo[0] if foo.exists() else None
1 votes
Duplication possible de Dans Django, comment puis-je utiliser objects.get, mais retourner None lorsque rien n'est trouvé ?
1 votes
@mustafa.0x Je ne pense pas que cela s'applique ici. Ici, la vérification du nombre d'utilisateurs lancerait une autre requête. Puis nous devrions à nouveau interroger pour obtenir les données réelles. C'est un cas où filtrer puis compter aurait plus de sens... mais pas plus de sens que filtrer et appeler...
first()
:P0 votes
stackoverflow.com/a/20674112/1259116