[英]Django - Using defaults if query fails
我正在嘗試創建一個腳本,該腳本將在一個簡單的查詢中檢索用戶帳戶,並同時檢索特定用戶帳戶“主題”。 這是我正在使用的代碼,請注意get_account方法:
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)
它工作得很好,但是如果出於某種原因'theme'對象返回null(這永遠都不會發生,但是我想確定!),它將重定向到404頁面。 我要它做的是檢查主題對象是否存在並且有效,如果沒有,則默認使用標准主題並繼續。
如果用戶帳戶無效,我仍然希望查詢拋出404。 缺少使用大量的try / exception負載,是否有一種很好的干凈方法? 我喜歡讓我的經理保持整潔:)
希望有人能幫忙
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
在您的示例中,如果相關主題為null,則不會生成404,因為它不是使用get_object_or_404()檢索的對象。 如果找不到既是ACTIVE_STATUS又是匹配的子彈的Account對象,它將僅顯示404。
為確保您將默認主題與任何有效的Account對象一起使用,我的建議是:
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__
方法,因為它不會執行默認方法不會做的任何事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.