Django: удалить условие фильтра из набора запросов
У меня есть сторонняя функция, которая дает мне отфильтрованный запрос (например, записи с "valid" = True), но я хочу удалить конкретное условие (например, чтобы все записи были действительными и недействительными).
Есть ли способ удалить условие фильтра для уже отфильтрованного запроса на запрос?
например.
only_valid = MyModel.objects.filter(valid=True)
all_records = only_valid.**remove_filter**('valid')
(Я знаю, что было бы лучше определить "all_records" до "only_valid", но это всего лишь пример...)
Ответы
Ответ 1
От документы:
Каждый раз, когда вы уточняете QuerySet, вы получаете совершенно новый QuerySet, который никак не связан с предыдущим QuerySet. Каждое уточнение создает отдельный и отличный QuerySet, который можно хранить, использовать и повторно использовать.
Поэтому я сомневаюсь, что есть стандартный способ сделать это. Вы можете вставить код, см., Что filter()
делает и пытается немного. Если это не помогает, я полагаю, вам не повезло, и вам нужно снова выполнить запрос.
Ответ 2
Хотя официального способа сделать это с использованием нотации фильтра, вы можете легко сделать это с помощью Q -notation.
Например, если вы гарантируете, что функция третьей части возвращает объект Q, а не отфильтрованный QuerySet, вы можете сделать следующее:
q = ThirdParty()
q = q | Q(valid=False)
И полученные SQL-условия будут объединены с помощью оператора OR.
Ответ 3
Вот что я сделал в подобном случае.
all_records = MyModel.objects.all()
only_valid = MyModel.objects.filter(valid=True)
only_valid.original = all_records
...
all_records = only_valid.original
Очевидно, что это также очищает любые другие фильтры, поэтому это не будет правильным для каждого случая.
Ответ 4
Спасибо, что заставило меня проверить исходный код Boldewyn. Таким образом, кажется, что существует новый метод, расположенный ниже filter() с теми же параметрами... exclude() (с момента совершения mini- hash ef6c680, когда он теряет номер строки)
Возвращает новый экземпляр QuerySet с NOT (args) ANDed к существующему набору.
Итак, чтобы ответить на исходный вопрос:
only_valid = MyModel.objects.filter(valid=True)
filtered_results = only_valid.exclude(the_condition_to_remove=True)