2010-12-09 30 views
0

我試圖創建一個腳本,它將檢索用戶帳戶,同時特定用戶在一個簡單查詢中記錄「主題」。這裏是我使用的代碼,請注意get_account方法:Django - 如果查詢失敗,使用默認設置

class AccountManager(Manager): 
    def __init__(self, *args, **kwargs): 
     super(AccountManager, self).__init__(*args, **kwargs) 

    def get_account(self, slug): 
     return get_object_or_404(self.select_related('theme'), status__exact=self.model.ACTIVE_STATUS, slug__exact=slug) 

它工作得很好,但如果出於某種原因,「主題」對象返回空值(這是不可能發生的,但我想是肯定的!) ,它將重定向到404頁面。我想要做的是檢查主題對象是否存在並且是否有效,如果不存在,則默認爲標準主題並繼續。

我仍然想查詢拋出404如果用戶帳戶無效雖然。嘗試/異常的桶負載不足,是否有一個很好的乾淨的方式來做到這一點?我喜歡讓我的經理漂亮整潔:)

希望有人能幫助

回答

1
try: 
    account = self.select_related('theme').get(
       status__exact=self.model.ACTIVE_STATUS, slug__exact=slug 
      ) 
except self.model.DoesNotExist: 
    account = self.select_related('theme').get(slug="default_slug") 

return account 
+0

嗨,謝謝你的回覆。也許我在我的文章中並不清楚,但是我希望能夠在「主題」模型DoesNotExist時使用默認值,如果賬戶模型不存在,它將拋出404。 – Hanpan 2010-12-09 14:23:28

0

在你的榜樣,它不會導致404,如果相關的主題是零,因爲它是不是對象用get_object_or_404()檢索。如果找不到一個既有ACTIVE_STATUS又有一個匹配slu Account的帳戶對象,它將只有404。

我的建議,以確保您使用的是默認的主題有任何有效的客戶對象是:

class AccountManager(Manager): 
    def __init__(self, *args, **kwargs): 
     super(AccountManager, self).__init__(*args, **kwargs) 

    def get_account(self, slug): 
     account = get_object_or_404(self.select_related('theme'), status__exact=self.model.ACTIVE_STATUS, slug__exact=slug) 
     if not account.theme: 
      account.theme = default_theme_obj 
     return account 

我會讓你來決定你將如何得到default_theme_obj,因爲我不知道你的模型,緩存結構和什麼。

爲了讓您的經理保持整潔,您不需要使用__init__方法,因爲它不會執行任何默認的操作。