Я добавил 'отмененное' поле к своей модели, есть ли способ изменить образцовый запрос по умолчанию к чему-то как cancelled=False? не имея необходимость изменять все мой фильтровать/исключать запросы?
Вы можете сделать это с помощью настраиваемого диспетчера моделей и переопределить функцию 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.
Вы могли бы написать собственный диспетчер запросов , но я не верю, что это правильный путь. Это сделало бы неявное скрытое условие для фильтра, которое сделало бы код нечитаемым. Помните дзен Python: Явное лучше, чем неявное
. Определите места, где вам нужно добавить cancelled = False, и просто добавьте это, вот как вы должны это сделать.