Django - 如果查询失败,则使用默认值

时间:2010-12-09 12:35:05

标签: django

我正在尝试创建一个脚本,该脚本将检索用户帐户,同时特定用户在一个简单查询中记录“主题”。这是我正在使用的代码,请注意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。如果没有使用一桶试试/异常,有没有一个很好的干净方法呢?我喜欢让我的经理们保持干净整洁:)

希望有人可以提供帮助

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

在您的示例中,如果相关主题为null,则不会生成404,因为它不是使用get_object_or_404()检索的对象。如果找不到一个同时具有ACTIVE_STATUS和匹配slug的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__方法,因为它不会做任何默认的做法。