163 votes

Django filter versus get pour un seul objet ?

J'ai eu un débat à ce sujet avec quelques collègues. Existe-t-il un moyen privilégié de récupérer un objet dans Django lorsque l'on n'en attend qu'un seul ?

Les deux moyens les plus évidents sont :

   try: 
      obj = MyModel.objects.get(id=1)
   except MyModel.DoesNotExist:
      # we have no object!  do something
      pass

et

   objs = MyModel.objects.filter(id=1)
   if len(objs) == 1:
      obj = objs[0]
   else: 
      # we have no object!  do something
      pass

La première méthode semble plus correcte d'un point de vue comportemental, mais utilise des exceptions dans le flux de contrôle, ce qui peut introduire une certaine surcharge. La seconde est plus détournée mais ne lève jamais d'exception.

Avez-vous une idée de ce qui est préférable ? Laquelle est la plus efficace ?

1voto

joctee Points 674

Je suggère un design différent.

Si vous voulez exécuter une fonction sur un résultat possible, vous pouvez dériver de QuerySet, comme ceci : http://djangosnippets.org/snippets/734/

Le résultat est assez impressionnant, vous pouvez par exemple.. :

MyModel.objects.filter(id=1).yourFunction()

Ici, le filtre renvoie soit un queryset vide, soit un queryset avec un seul élément. Vos fonctions queryset personnalisées sont également chaînables et réutilisables. Si vous voulez l'exécuter pour toutes vos entrées : MyModel.objects.all().yourFunction() .

Elles sont également idéales pour être utilisées comme actions dans l'interface d'administration :

def yourAction(self, request, queryset):
    queryset.yourFunction()

0voto

zooglash Points 417

L'option 1 est plus élégante, mais veillez à utiliser try..except.

D'après ma propre expérience, je peux vous dire que parfois vous êtes sûr qu'il ne peut pas y avoir plus d'un objet correspondant dans la base de données, et pourtant il y en aura deux... (sauf bien sûr lorsqu'on obtient l'objet par sa clé primaire).

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