如何捕获django中的MultipleObjectsReturned错误

Tom*_*Tom 17 python django exception

是否有可能MultipleObjectsReturned在Django中捕获错误?

我做了一个搜索查询,如果有多个对象,我想要列表中的第一个,所以我尝试了这个:

try:
    Location.objects.get(name='Paul')
except MultipleObjectsReturned:
    Location.objects.get(name='Paul')[0]
Run Code Online (Sandbox Code Playgroud)

然而,在存在DOC虽然

全局变量MultipleObjectsReturned不存在

rof*_*fls 38

使用过滤器:

Location.objects.filter(name='Paul').first()
Run Code Online (Sandbox Code Playgroud)

或者导入例外:

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

  • 完美的作品,谢谢!忘了导入例外 (3认同)

Vas*_*han 25

这是更多的pythonic方式来做到这一点.

try:
    Location.objects.get(name='Paul')
except Location.MultipleObjectsReturned:
    Location.objects.filter(name='Paul')[0]
Run Code Online (Sandbox Code Playgroud)

  • 你的意思是“过滤器”,但至少它确实回答了如何捕获异常。 (2认同)

veg*_*ie1 8

这不是最好的做法.您可以在技术上执行此操作而不使用异常.你打算使用Location,并Car在这个例子吗?

你可以这样做:

Location.objects.filter(name='Paul').order_by('id').first()
Run Code Online (Sandbox Code Playgroud)

我强烈建议您阅读Django QuerySet API参考.

https://docs.djangoproject.com/en/1.8/ref/models/querysets/

要回答有关异常存在位置的问题,您始终可以在模型本身上访问这些QuerySet异常.例如Location.DoesNotExistLocation.MultipleObjectsReturned.如果已导入模型,则无需导入它们.

  • 这实际上不是问题的答案. (7认同)
  • “这不是最佳实践。” 您确定捕获异常不是最佳实践吗?我认为这可能是Python中的最佳做法。根据https://docs.python.org/3/glossary.html中的“ EAFP”,我认为/sf/answers/2252111011/是此处的正确答案。 (3认同)

小智 5

当您知道只有一个对象与您的查询匹配时,请使用 get。如果没有项目与查询匹配,get() 将引发DoesNotExist 异常。如果多个项目与查询匹配,get() 将引发 MultipleObjectsReturned 异常。像这样使用 get() :

try:
  one_entry = Entry.objects.get(blog=2000)
except Entry.DoesNotExist:
  # query did not match to any item.
  pass
except Entry.MultipleObjectsReturned:
  # query matched multiple items.
  pass
else:
  # query matched to just one item
  print(one_entry)
Run Code Online (Sandbox Code Playgroud)