Я добавил в модель свое отмененное поле, есть ли способ изменить запрос модели по умолчанию на что-то вроде cancel = False? без необходимости изменять все мои запросы на фильтрацию/исключение?Изменить запрос по умолчанию в django
ответ
Вы можете сделать это с помощью менеджера пользовательских моделей и переопределить функцию 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.
Вы можете написать обычай query manager, но я не верю, что это правильный путь. Это создаст неявное скрытое условие для фильтра, что сделает код нечитаемым. Запомнить Zen of Python: Explicit is better than implicit
. Определите места, где вам нужно добавить отмененный = False и просто добавьте это, так вы должны это делать.
Я категорически не согласен. Тогда будет ли смысл иметь заказчиков? Что такое неявное относительно 'not_cancelled = CustomManager()', а затем с помощью MyModel.not_cancelled.all()? – jonwd7
вы должны быть ОЧЕНЬ ОЧЕНЬ осторожны с переопределением менеджера по умолчанию именно так. В этом конкретном случае, когда элемент отменен, вы никогда не найдете его с фильтром()/get(). –
Согласовано. Я обычно дополнил бы этот подход переопределением get(), чтобы не использовать этот фильтр, если задан pk. Вероятно, вы также захотите изменить запрос администратора, чтобы вернуть все, включая отмененный. Но если вы редко хотите отменить элементы в своих запросах, это может быть разумным подходом. –
Привет, есть ли способ изменить поведение get_query_set для использования дополнительных параметров, то есть переданных от где-либо, или использовать глобальные переменные, такие как текущая информация пользователя входа? благодаря! – ultrajohn