2014-02-16 64 views
1

RealEstateAgent是一個模型,並在做RealEstateAgent.objects.filter(name = 'better homes')返回5個對象。使用Django-orm查詢多個對象

我想用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. 
+0

但是你回溯說,它提高'DoesNotExist',不'MultipleObjectReturns'。我錯過了什麼嗎? – mhlester

+0

我不明白爲什麼它提高'DoesNotExist' – user3030969

+0

你的錯誤說'匹配查詢不存在.'我會從那裏開始 – mhlester

回答

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 
+0

這些是存在於MySQL數據庫中的對象:更好的家園伊朗,更好的家園印度,更好的家園卡塔爾等等。例外情況是被'DoesNotExist'捕獲,但我想捕獲所有獲得的對象回。 – user3030969

+0

@ user3030969啊,你似乎誤解了什麼異常處理。 –

+0

@ user3030969更新了我的回覆。 –