【问题标题】:Querying for multiple objects with Django-orm使用 Django-orm 查询多个对象
【发布时间】:2014-02-16 07:07:54
【问题描述】:

RealEstateAgent 是一个模型,RealEstateAgent.objects.filter(name = 'better homes') 返回 5 个对象。

我想使用RealEstateAgent.objects.get(name='better homes') 来捕获MultipleObjectsReturned 异常。

我正在尝试这个,但异常没有被捕获。

from django.core.exceptions import MultipleObjectsReturned
try:
  RealEstateAgent.objects.get(name='bh')
except MultipleObjectsReturned, e:
  print ''

这是回溯:

DoesNotExist                              Traceback (most recent call last)
<ipython-input-49-9458986408df> in <module>()
      1 try:
----> 2     RealEstateAgent.objects.get(name='better homes')
      3 except MultipleObjectsReturned, e:
      4     print ''
      5 

/home/dubizzle/webapps/django/src/django/django/db/models/manager.pyc in get(self, *args, **kwargs)
    130 
    131     def get(self, *args, **kwargs):
--> 132         return self.get_query_set().get(*args, **kwargs)
    133 
    134     def get_or_create(self, **kwargs):

/home/dubizzle/webapps/django/src/django/django/db/models/query.pyc in get(self, *args, **kwargs)
    347         if not num:
    348             raise self.model.DoesNotExist("%s matching query does not exist."
--> 349                     % self.model._meta.object_name)
    350         raise self.model.MultipleObjectsReturned("get() returned more than one %s -- it returned %s! Lookup parameters were %s"
    351                 % (self.model._meta.object_name, num, kwargs))

DoesNotExist: RealEstateAgent matching query does not exist.

【问题讨论】:

  • 但是您的回溯表明它正在提高DoesNotExist,而不是MultipleObjectReturns。我错过了什么吗?
  • 我不明白为什么要提高DoesNotExist
  • 你的错误是matching query does not exist.我会从那里开始
  • 奇怪。该查询实际上返回 5 个对象。为什么它会引发MultipleObjectsReturned
  • @user3030969 显然,查询实际上并没有返回五个对象。

标签: python django django-orm


【解决方案1】:

您的代码似乎存在一些更深层次的问题,但如果没有更多信息,这些问题很难调试。然而,就您最初的问题而言,您的线路:

except MultipleObjectsReturned, e:

只会捕获MultipleObjectsReturned 类型的异常。但是,如果您查看回溯,您会看到引发的实际异常是 DoesNotExist 异常。

如果您将 except 行(上面)更改为:

except DoesNotExist, e:

它应该正确捕获该异常。

至于为什么首先引发异常,我愿意猜测您的数据库中没有该对象。你在任何地方插入它吗?如果您正在寻找一个在您尝试访问它时会自动为您构建条目的后端,请查看mongodb。但是,如果您尝试访问不存在的对象,您当前的 SQL 数据库将会出错。

根据您在 cmets 中所说的话,您似乎误解了异常处理的确切含义。特别是当您 catch 异常时,您是在说“这是一个我知道可能发生的错误,我有一个应急案例”。

您可能会收到MultipleObjectsReturned 异常的原因是因为您上面使用的get 方法专门用于返回单个 结果。如果您想查询多个条目,请改用filter

my_objects = RealEstateAgent.objects.filter(name='bh')

这将返回一个QuerySet,其中填充了与您的查询匹配的条目。

话虽如此,由于引发了 DoesNotExist 异常,因此您假设数据库中有五个与查询匹配的对象似乎是不正确的。

为了解决您的用例,您可以很容易地按照以下方式实现一些东西:

my_objects = RealEstateAgent.objects.filter(name='bh')
if len(my_objects) > 1:
    # Ask user to pick one

【讨论】:

  • 这些是存在于MySQL 数据库中的对象:伊朗更好的家园、印度更好的家园、卡塔尔更好的家园等。例外是确实被DoesNotExist 捕获,但我想捕获所有返回的对象。
  • @user3030969 啊,你好像误解了什么是异常处理。
  • 我想我的问题不清楚。这就是我想要做的:要求用户输入房地产经纪人名称,如果多个对象返回该名称,请用户选择一个名称。我认为filter 是这里的路吗?
  • @user3030969 当然,我更新了我的答案以包含一个示例。
猜你喜欢
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-19
  • 1970-01-01
  • 2014-05-27
  • 2010-11-13
相关资源
最近更新 更多