2009-03-23 20 views
6

Czy w Django istnieje standardowy sposób pisania złożonych, niestandardowych filtrów dla kwerendy?Django Niestandardowe filtry zapytań

Jak mogę napisać

MyClass.objects.all().filter(field=val) 

chciałbym zrobić coś takiego:

MyClass.objects.all().filter(customFilter) 

mogłem użycie wyrażenia generatora

(x for x in MyClass.objects.all() if customFilter(x)) 

ale straci łańcuchowość i inne funkcje, które zapewnia QuerySets.

Odpowiedz

5

Myślę, że możesz potrzebować niestandardowego managers.

+0

Chyba potrzebuję tego. Ale wygląda na bardzo skomplikowane w porównaniu do tego, że jest w stanie przekazać funkcję filtra w locie. – interstar

+0

Nie jest to zbyt skomplikowane i dobrze jest tworzyć niestandardowe menedżery, zwłaszcza jeśli planujesz buforowanie danych z db itp. – Vasil

13

Rekomendacja do rozpoczęcia korzystania z metod menedżerskich jest bardzo dobra, ale aby odpowiedzieć na Twoje pytanie bardziej bezpośrednio: tak, użyj Q objects. Na przykład:

from django.db.models import Q 

complexQuery = Q(name__startswith='Xa') | ~Q(birthdate__year=2000) 

MyModel.objects.filter(complexQuery) 

Obiekty Q można łączyć z | (OR), & (AND) i ~ (NOT).

Powiązane problemy