2016-10-02 6 views
1

Джанго 1.10.1СЦЕПЛЕНИЕ фильтры

На странице я приготовил много контроля. Некоторые из них организованы как динамически изменяющиеся формы. Поэтому я даже не знаю, сколько из них присутствует.

Мне нужны цепные фильтры с И, ИЛИ ИЛИ НЕ логическими операциями.

Например, мне нужно что-то вроде этого:

Entry.objects.filter(headline__startswith='What').exclude(pub_date__gte=datetime.date.today()).filter(pub_date__gte=datetime(2005, 1, 30)).filter(Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)) 

еще раз количество фильтров меняется.

Я планировал ac как это: loop through request.POST и в зависимости от дюжины условий подготовьте строку. Та же строка:

"Entry.objects.filter(headline__startswith='What').exclude(pub_date__gte=datetime.date.today()).filter(pub_date__gte=datetime(2005, 1, 30)).filter(Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))"

Таким образом, строка является правильным. Но я не могу заставить его работать с exec(). Я спросил здесь: почему он не работает. И ответ был: он не будет работать, запустите код Python напрямую.

я могу построить что-то подобное:

entries = Entry.objects.filter(**kwargs) 

Но это только один фильтр. Я не могу представить, как цепочки таких фильтров.

Не могли бы вы помочь мне здесь &

+0

Хотелось бы узнать, как выглядит ваш запрос «POST». – demux

ответ

0

Вы можете цепи в QuerySet на нескольких линиях - добавление дополнительных запросов в зависимости от вида логики. Эти запросы не выполняются по мере их создания, только когда они вызываются.

Я не уверен, что это «лучший» или самый пифонический способ, но что-то в этом роде очень хорошо работает для меня. Это использование вспомогательных методов Джанго Rest Framework, но она должна быть применима без:

def get(self, request, format=None, *args, **kwargs): 
     name = request.GET.get('name', None) 
     location = request.GET.get('location', None) 
     id = request.GET.get('id', None) 

     results = Model.objects.all().order_by('-created') # this would be the default with no filters on it 
     results = results.filter(name__iexact=name) if name else results 
     results = results.filter(location__icontains=location) if location else results 
     results = results.filter(id__exact=id) if id else results 

     # process/serialize/send response 

Не зная, какие параметры вы получите может быть сложно, но идея может быть петлей над kwargs и следовать той же схеме в (обратите внимание, что я не тестировал его):

def get(self, request, format=None, *args, **kwargs): 

     results = Model.objects.all().order_by('-created') # this would be the default 
     for param, value in kwargs.items(): 
      results = results.filter(***need to convert param to orm field***= value) 
+0

Работа. Но по-прежнему существует проблема с цепочками операторов OR. Мне нужно что-то вроде Article.objects.filter ( Q (title__contains = "table") | Q (title__contains = "helm") ). Ну, это проблема - синтаксис - это фильтр (** kwargs). Но как передать это «я»? – Michael

+0

Можете ли вы следовать шаблону, подобному этому? http://stackoverflow.com/a/852481/4396787 –

+0

Большое спасибо. – Michael

Смежные вопросы