2009-03-23 3 views
6

Есть ли в Django стандартный способ создания сложных пользовательских фильтров для QuerySets?Django Custom Queryset filters

Так же, как я могу написать

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

Я хотел бы сделать что-то вроде этого:

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

я мог бы использовать выражение генератора

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

но утратит цепочки и любые другие функции, предоставляемые QuerySets.

ответ

5

Думаю, вам может понадобиться обычай managers.

+0

Я думаю, мне это нужно. Но он выглядит ужасно сложным по сравнению с тем, что он способен передавать функцию фильтра «на лету». – interstar

+0

Это не очень сложно, и это хорошая практика для создания пользовательских менеджеров, особенно если вы планируете кэшировать материал из db и т. Д. – Vasil

13

Рекомендация, чтобы начать использовать методы менеджера, является хорошей, но чтобы ответить на ваш вопрос более непосредственно: да, используйте Q objects. Например:

from django.db.models import Q 

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

MyModel.objects.filter(complexQuery) 

Q объектов можно комбинировать с | (OR), & (AND) и ~ (НЕ).