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)