2013-07-10 6 views
0

Я пытаюсь сделать представление, которое примет произвольное количество поисковых терминов, и отфильтровать определенный объект с этими терминами.Произвольное число поисковых запросов

Я думаю, что у url будет шаблон, который выглядит примерно так: /[property]=[value]/[property]=[value]/..., где этот шаблон может продолжаться до тех пор, пока пользователь хочет. Затем я смогу разобрать это, сделав что-то вроде: search=match.split('/'). Тогда я буду перебирать каждый пункт в поиске, что-то вдоль линий:

results=myObject.objects.all() 
for item in search: 
    items=item.split('=') 
    results=results.filter(items[0]=items[1]) 

К сожалению, я говорю, что ключевые слова не могут быть выражениями. Есть ли способ, которым я могу иметь ключевое слово быть переменной? Спасибо

+1

Что вы имеете в виду «К сожалению, я говорю, что ключевые слова не могут быть выражениями»? – matino

+0

Он хочет передать аргументы ключевого слова, где 'items [0]' - это ключевое слово, а 'items [1]' - его значение. – Brian

+0

Возможный дубликат [Хорошая практика для гибкой страницы поиска - Django] (http://stackoverflow.com/questions/3202922/good-practices-for-a-flexible-search-page-django) – matino

ответ

0

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

>>> items = ['a','b','c'] 
>>> def print_kwargs(**kwargs): 
... for key,value in kwargs.iteritems(): 
...  print "%s = %s" % (key, value) 
... 
>>> d = {items[0] : items[1]} 
>>> print_kwargs(**d) 
a = b 

Для примера:

d = {} 
for item in search: 
    items = item.split('=') 
    d[items[0]] = items[1] 
results = results.filter(**d) 
+0

Отлично! Благодарю. Еще один вопрос. Если мне нужно фильтровать на основе атрибута, который находится в объекте, хранящемся внутри этого объекта (то есть, у меня есть объект A, который имеет ссылку на внешний ключ для объекта B, и мне нужно фильтровать на основе атрибута, хранящегося объектом B) Как я могу это сделать? Если бы мне не нужно было использовать kwarg, это было бы относительно просто, просто «results.filter (B__property = value)». Как я могу это сделать, используя словарь? –

+0

@ dar2162 Я предопределю это тем, что я не знаю Django, но если бы это было просто просто 'B__property = value', просто добавьте эту пару значений ключа в словарь, например' d [B__property] = value', прежде чем передавая его для фильтрации. Этот словарь может содержать любые пары ключевых значений, которые вы хотите рассматривать как аргументы ключевых слов. – Brian

+0

Фантастический! Хотя, это должна быть конкатенированная строка, то есть 'property = 'B __% s'% items [0]' then 'd [property] = items [1]' –

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