Подтвердить что ты не робот

Изменить задание по умолчанию в django

Я добавил поле "отменено" в мою модель, есть ли способ изменить запрос модели по умолчанию на что-то вроде cancel = False? без необходимости изменять все мои запросы на фильтрацию/исключение?

4b9b3361

Ответ 1

Вы можете сделать это с помощью менеджера пользовательских моделей и переопределить функцию get_queryset, чтобы всегда отфильтровывать отмененную = False.

class CustomManager(models.Manager):
    def get_queryset(self):
        return super(CustomManager, self).get_queryset().filter(canceled=False)

class MyModel(models.Model):
    # Blah blah
    objects = CustomManager()

Затем при вызове MyModel.objects.all() он всегда будет исключать отмененные объекты. Вот сообщение в блоге, которое я нашел полезным по этому вопросу. http://www.b-list.org/weblog/2006/aug/18/django-tips-using-properties-models-and-managers/

EDIT: Возможно, лучший подход с пользовательским менеджером заключается в том, чтобы прикрепить его к другому свойству, отличному от объектов, например:

class MyModel(models.Model):
    # Blah blah
    active = CustomManager()

И в ваших представлениях ваши запросы будут выглядеть как MyModel.active.all().

EDIT2: Обновлен метод орфографии от get_query_set до get_queryset для современных версий django.

Ответ 2

Вы можете написать собственный менеджер запросов, но я не считаю, что это правильный путь. Это создаст неявное скрытое условие для фильтра, что сделает код нечитаемым. Запомнить Zen of Python: Explicit is better than implicit. Определите места, где вам нужно добавить cancel = False и просто добавьте это, чтобы вы это сделали.