我正在尝试创建一个脚本,该脚本将检索用户帐户,同时特定用户在一个简单查询中记录“主题”。这是我正在使用的代码,请注意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。如果没有使用一桶试试/异常,有没有一个很好的干净方法呢?我喜欢让我的经理们保持干净整洁:)
希望有人可以提供帮助
答案 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__
方法,因为它不会做任何默认的做法。