簡體   English   中英

Django-如果查詢失敗,則使用默認值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM