Python 如何捕获django中的多对象返回错误

Python 如何捕获django中的多对象返回错误,python,django,exception,Python,Django,Exception,是否可以捕获Django中的多对象返回的错误 我执行搜索查询,如果有多个我想要的对象,则将获取列表中的第一个对象,因此我尝试了以下方法: try: Location.objects.get(name='Paul') except MultipleObjectsReturned: Location.objects.get(name='Paul')[0] 然而,它存在于思想中 全局变量multipleObjectsReturn不存在 使用过滤器: Location.objects.

是否可以捕获Django中的
多对象返回的
错误

我执行搜索查询,如果有多个我想要的对象,则将获取列表中的第一个对象,因此我尝试了以下方法:

try:
    Location.objects.get(name='Paul')
except MultipleObjectsReturned:
    Location.objects.get(name='Paul')[0]
然而,它存在于思想中

全局变量multipleObjectsReturn不存在

使用过滤器:

Location.objects.filter(name='Paul').first()
或导入异常:

from django.core.exceptions import MultipleObjectsReturned
...
try:
    Location.objects.get(name='Paul')
except MultipleObjectsReturned:
    Location.objects.filter(name='Paul').first()

这不是最好的做法。从技术上讲,您可以在不使用异常的情况下执行此操作。您是否打算在本例中使用
位置
汽车

您可以这样做:

Location.objects.filter(name='Paul').order_by('id').first()
我强烈建议您阅读Django QuerySet API参考资料


要回答有关异常存在于何处的问题,您可以始终访问模型本身上的这些QuerySet异常。例如,
Location.DoesNotExist
Location.multipleobjects返回
。如果已经导入了模型,则不需要导入它们。

这是一种更具python风格的方法

try:
    Location.objects.get(name='Paul')
except Location.MultipleObjectsReturned:
    Location.objects.filter(name='Paul')[0]

实际上,即使我们使用
MyModel.objects.get\u或
,由于竞争条件,仍然有机会创建多个实例。因此,当我们必须使用
MyModel.objects.get
MyModel.objects.get\u或\u create
时,我们仍然需要返回多个对象

要处理此问题:

from django.core.exceptions import MultipleObjectsReturned

try:
    obj,is_created=MyModel.objects.get_or_create(....)
except MultipleObjectsReturned as e:
    # handle the case as you need here
    pass

如果我没有弄错的话,这个例外是模型的一个特性。由于该变量不存在,错误似乎让我相信是这样。然而,我建议使用filter,它返回一个queryset,然后您可以使用索引获取查询集中的第一项。Get用于返回1个实际对象。所以你不必处理错误检查。是的,没错!对不起,两次都是指位置。为什么使用异常不是最佳做法?那么您可能只需要
Location.objects.filter(name='Paul')。order_by('id')。first()
。如果没有具有该名称的记录,则返回None。我更新了答案。在这种情况下不需要使用异常。与其引发异常,您仍然可以在不引发任何错误的情况下获得一条愉快的路径。这实际上不是问题的答案。“这不是最佳实践。”您确定捕获异常不是最佳实践吗?我认为这可能是Python中的最佳实践。根据中的“EAFP”,我认为这是正确的答案。它在Django的较旧版本(如1.5)中不起作用。使用first()会给出AttributeError。我不得不导入多个返回的对象。你的意思是
过滤器
,但至少它回答了如何捕获异常。@RemcoGerlich yes它根据查询过滤或返回对象。get return object,而.filter返回queryset。@VaseemAhmedKhan答案应更新为do
Location.objects.filter(name='Paul')[0]
,否则except块将导致引发相同的异常。您需要一个查询集,因为它包含要返回哪个对象的逻辑,例如
Location.objects.get(name='Paul')。order_by('age')[0]
将返回数据库中最年轻的Paul。根据您的业务逻辑,这就是返回正确Paul的方式。@AlanSE否,异常块不会抛出相同的异常。它可能会引发
DoesNotExist
异常,但不会引发
MultipleObjectsReturned
。注意:
Location.objects.get(name='Paul')[0]
将再次引发
MultipleObjectsReturned
。改用
Location.objects.filter(name='Paul').first()