使用Django-orm查询多个对象

时间:2014-02-16 07:07:54

标签: python django django-orm

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.

1 个答案:

答案 0 :(得分:2)

您的代码似乎存在一些更深层次的问题,但如果没有更多信息,则难以调试。至于你原来的问题,你的行:

except MultipleObjectsReturned, e:

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

如果您将除外线(上图)更改为:

except DoesNotExist, e:

它应该正确捕获该异常。

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

根据您在评论中所说的内容,您似乎误解了究竟是什么异常处理。特别是当你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