Comment gérer les “correspondant à la requête n'existe pas” lors de l'obtention d'un objet
Quand je veux sélectionner les objets avec un get() de la fonction comme
personalProfile = World.objects.get(ID=personID)
Si obtenir la fonction ne retourne pas de trouver une valeur, un "correspondant à la requête n'existe pas." erreur se produit.
Si je n'ai pas besoin de cette erreur, je vais l'utiliser à essayer et à l'exception de la fonction
try:
personalProfile = World.objects.get(ID=personID)
except:
pass
Mais je pense que ce n'est pas la meilleure façon depuis que j'utilise
except:
pass
S'il vous plaît recommander une idée ou un exemple de code pour lutter contre ce problème
Vous devez vous connecter pour publier un commentaire.
Ça dépend de ce que vous voulez faire si il n'existe pas..
Theres
get_object_or_404
:Qui est très proche de l'essayer à l'exception de code, vous ne le font actuellement.
Sinon il y a
get_or_create
:Bien que, Si vous choisissez de poursuivre votre démarche actuelle, au moins s'assurer de l'exception est localisée à l'corriger les erreurs et de faire quelque chose avec que nécessaire
ci-dessus try/except la poignée est similaire à ce qui est trouvé dans les docs pour get_object_or_404...
Un
get_or_none()
fonction a été proposé, plusieurs fois maintenant. L'avis de rejet est fonction de fluage, qui vous peut ou peut ne pas être d'accord. La fonctionnalité est présente --légèrement différentes sémantique-- dans lefirst()
queryset méthode.Mais tout d'abord:
Le gestionnaire jette
World.DoesNotExist
spécialisé de la sous-classe deObjectDoesNotExist
lorsqu'unWorld
objet n'a pas été trouvé:Il y a aussi
get_object_or_404()
qui soulève unHttp404
exception lorsque l'objet n'a pas été trouvé.Vous pouvez également rouler vos propres
get_or_none()
. Une mise en œuvre possible pourrait être:Notez que cela soulève
MultipleObjectsReturned
lorsque plus d'un objet correspondant est trouvé. Si vous voulez toujours le premier objet, indépendamment de tout les autres, vous pouvez simplifier l'utilisationfirst()
, qui renvoieNone
lorsque le queryset est vide:Noter, cependant, pour que cela fonctionne correctement, vous avez besoin d'un bon de commande pour les objets, en raison de la présence de plusieurs objets
first()
pourrait être non-déterministe (c'est probablement retourne le premier objet de la base de données de l'index utilisé pour filtrer la requête et ni les indices de pas les tables sous-jacentes doivent être triés, ni même d'être reproductibles à l'ordre).Utiliser à la fois, cependant, seulement lors de l'utilisation de l'objet à récupérer est strictement facultatif pour les autres flux de programme. Lors de l'échec pour récupérer un objet est une erreur, utilisez
get_object_or_404()
. Quand un objet doit être créé lorsqu'il n'existe pas, utilisezget_or_create()
. Dans ces cas, les deux sont mieux adaptés pour simplifier le flux de programme.first()
ajout de la méthode dans Django 1.6 est assez similaire àget_or_none
. Notez que vous n'êtes pas de la manipulationMultipleObjectsReturned
dans votre méthode. Lefirst()
méthode prend tout simplement le premier élément, et ignore le reste.MultipleObjectsReturned
est tout à fait intentionnelle. Cependant, oui,get_or_none()
peut être simplifié à l'utilisationfirst()
. Avez-vous vérifié comment cela influe sur le SQL généré des requêtes?MyModel.objects.filter(**kwargs).first()
fait la même choseget_object_or_none(MyModel, **kwargs)
, à moins que vous vous souciez vraiment deMultipleObjectsReturned
(qui je suppose que la plupart du temps, vous n'avez pas). Je n'ai pas examiné le SQL, mais j'attends qu'il sera assez similaire, peut-être avec quelques différences aveclimit
.MultipleObjectsReturned
. Lorsqu'il y a plusieurs objets qui correspondent au filtre et je veux qu'un,first()
peut retourner tout de leur non-déterministe en fonction de si le sous-jacent queryset est triée ou non. Si vous préférez de django à aboyer à moi, fort et clair quand ça arrive ;).MultipleObjectsReturned
est important parfois, c'est pourquoi j'ai mentionné pour commencer. Dans ces cas, vous avez besoin de l'essayer à l'exception du bloc de gérer ça, et dans ce cas, je préfère utiliserget()
, plutôt que d'unget_or_none()
raccourci qui gère une exception possible, mais pas dans l'autre.get_or_none()
dans quelques chargeur de scripts principalement comme un substitut pourget_or_create()
où la récupération des besoins différents arguments que l'associé de créer (c'est à dire quelque chose comme get_or_create_with_default_args). Dans ces cas, aucun objet n'est d'accord, mais de plusieurs objets est une erreur fatale. Aussi je viens de vérifier et j'ai effectivement l'utiliser double non script code, alors vous êtes probablement droit et le cas d'utilisation est assez spécial.first()
pour les futurs lecteurs 🙂