Изменить набор запросов по умолчанию в Django - PullRequest
24 голосов
/ 22 марта 2010

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

Ответы [ 2 ]

35 голосов
/ 22 марта 2010

Вы можете сделать это с помощью специального менеджера моделей и переопределить функцию 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 / блог / 2006 / август / 18 / Джанго-подсказки-используя-свойства-модели-и-менеджеры /

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

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

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

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

3 голосов
/ 22 марта 2010

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

...