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

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

24
задан Georg Fritzsche 15 May 2010 в 19:55
поделиться

2 ответа

Вы можете сделать это с помощью настраиваемого диспетчера моделей и переопределить функцию get_queryset , чтобы всегда фильтровать cancelled = 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/

РЕДАКТИРОВАТЬ: Возможно, лучше подход с настраиваемым менеджером состоял бы в том, чтобы прикрепить его к другому свойству, отличному от объектов, например:

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

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

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

37
ответ дан 28 November 2019 в 23:39
поделиться

Вы могли бы написать собственный диспетчер запросов , но я не верю, что это правильный путь. Это сделало бы неявное скрытое условие для фильтра, которое сделало бы код нечитаемым. Помните дзен Python: Явное лучше, чем неявное . Определите места, где вам нужно добавить cancelled = False, и просто добавьте это, вот как вы должны это сделать.

3
ответ дан 28 November 2019 в 23:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: