Django: удалить условие фильтра из набора запросов - PullRequest
14 голосов
/ 14 января 2011

У меня есть сторонняя функция, которая дает мне отфильтрованный набор запросов (например, записи с 'valid' = True), но я хочу удалить определенное условие (например, чтобы все записи, как действительные, так и недействительные).

Есть ли способ удалить условие фильтрации для уже отфильтрованного набора запросов?

Например,

only_valid = MyModel.objects.filter(valid=True)
all_records = only_valid.**remove_filter**('valid')

(я знаю, что было бы лучше определить 'all_records' перед 'only_valid ', но это всего лишь пример ...)

Ответы [ 4 ]

11 голосов
/ 14 января 2011

Хотя нет официального способа сделать это с помощью обозначения фильтра, вы можете легко сделать это с помощью примечания Q .Например, если вы убедитесь, что функция третьей части возвращает объект Q, а не отфильтрованный QuerySet, вы можете сделать следующее:

q = ThirdParty()
q = q | Q(valid=False)

И результирующие условия SQL будут объединены с помощью оператора OR.

4 голосов
/ 14 января 2011

С документы :

Каждый раз, когда вы улучшаете QuerySet, вы получаете совершенно новый QuerySet, который никак не связан с предыдущим QuerySet. Каждое уточнение создает отдельный и отдельный QuerySet, который можно хранить, использовать и использовать повторно.

Поэтому я сомневаюсь, что есть стандартный способ сделать это. Вы можете копаться в коде , посмотреть, что делает filter() и попробовать немного. Если это не поможет, я предполагаю, что вам не повезло, и вам нужно пересоздать запрос самостоятельно.

1 голос
/ 11 января 2012

Вот что я сделал в похожем случае.

all_records = MyModel.objects.all()
only_valid = MyModel.objects.filter(valid=True)
only_valid.original = all_records

...

all_records = only_valid.original

Очевидно, что это очищает и любые другие фильтры, поэтому это не будет правильным для каждого случая.

0 голосов
/ 24 января 2018

Спасибо, что заставили меня проверить исходный код Boldewyn.Итак, кажется, что прямо под filter () есть новый метод с теми же параметрами ... с именем exclude () (для коммитов мини-хеша ef6c680, когда он теряет номер строки)

Вернуть новый экземпляр QuerySet с NOT (args) ANDed в существующий набор.

Итак, чтобы ответить на исходный вопрос:

only_valid = MyModel.objects.filter(valid=True)
filtered_results = only_valid.exclude(the_condition_to_remove=True)
...