Django - использование значений по умолчанию в случае сбоя запроса - PullRequest
0 голосов
/ 09 декабря 2010

Я пытаюсь создать сценарий, который будет извлекать учетную запись пользователя и в то же время учетную запись конкретного пользователя «theme» в одном простом запросе.Вот код, который я использую, обратите внимание на метод 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' возвращает ноль (это никогда не должно происходить, но я хочу быть уверен, что!), он будет перенаправлен на страницу 404.То, что я хочу сделать, это проверить, существует ли объект темы и является ли он действительным, а если нет, использовать стандартную тему по умолчанию и продолжить.

Я все еще хотел бы, чтобы запрос выдавал 404, если учетная запись пользователяне действует, хотя.Если не считать использования групповой попытки / исключений, есть ли хороший чистый способ сделать это?Мне нравится, чтобы мои менеджеры были аккуратны и аккуратны:)

Надеюсь, что кто-то может помочь

Ответы [ 2 ]

1 голос
/ 09 декабря 2010
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 голосов
/ 09 декабря 2010

В вашем примере это не приведет к 404, если связанная тема была бы нулевой, поскольку это не объект, извлекаемый с помощью get_object_or_404 ().Это будет только 404, если не сможет найти объект Account, который является и ACTIVE_STATUS, и совпадающим слагом.

Я предлагаю убедиться, что вы используете тему по умолчанию с любым действительным объектом 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__, поскольку он не делает ничего такого, чего не было бы по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...