2011-01-14 13 views
13

Mam funkcję innej firmy, która daje mi filtrowany zestaw zapytań (np. Rekordy z 'valid' = True), ale chcę usunąć konkretny warunek (np. Mieć wszystkie rekordy, zarówno prawidłowe, jak i nieważne).Django: usuń warunek filtru z zestawu zapytań

Czy istnieje sposób usunięcia warunku filtru do już przefiltrowanego zestawu pytań?

E.g.

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

(wiem, że to byłoby lepsze zdefiniowanie 'all_records' przed 'only_valid', ale to tylko przykład ...)

+0

można pokazać przykład kodu, proszę? –

Odpowiedz

4

Od the docs:

Każdorazowe dopracowujesz QuerySet, otrzymujesz zupełnie nowy QuerySet, który nie jest w żaden sposób związany z poprzednim QuerySet. Każde udoskonalenie tworzy osobny i odrębny zestaw kwerend, który można przechowywać, wykorzystywać i ponownie wykorzystywać.

Wątpię w to, że istnieje standardowy sposób, aby to zrobić. Możesz dig into the code, zobacz, co robi filter() i spróbuj trochę. Jeśli to nie pomoże, moim założeniem jest, że nie masz szczęścia i musisz ponownie zbudować zapytanie.

10

Mimo że nie można tego zrobić w żaden oficjalny sposób za pomocą notacji filtru, można to łatwo zrobić za pomocą Q -notacja. Na przykład, można zapewnić, że działanie innych części zwraca się obiekt Q, nie filtrowanego QuerySet, można wykonać następujące czynności:

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

i wynikające z warunków SQL zostaną połączone za pomocą lub użytkownika.

+0

Będziesz potrzebować dostępu do kodu strony trzeciej, ale tak, to jest dobre rozwiązanie. +1 – Boldewyn

1

Oto, co zrobiłem w podobnej sprawie.

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

... 

all_records = only_valid.original 

Oczywiście usuwa również wszelkie inne filtry, więc nie będzie to właściwe dla każdego przypadku.

0

Dzięki za sprawdzenie kodu źródłowego Boldewyn. Tak więc, wydaje się, że jest to nowa metoda tuż pod filtrem() z tymi samymi parametrami ... nazywa exclude() (od popełnienia mini-hash ef6c680, bo gdy traci ona swój numer linii)

Return nowa instancja QuerySet z NOT (args) ANDed do istniejącego zestawu.

Tak więc, aby odpowiedzieć na oryginalne pytanie:

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

'exclude' po prostu dodaje kolejny filtr, zachowując istniejące. Nie przywraca pełnego zestawu zapytań. – Don

+0

Och, widzę! Wówczas źle zrozumiałem pytanie. Dzięki za wyczyszczenie tego :) – iddy