Как проще всего объединить __contains и __in? - PullRequest
2 голосов
/ 14 ноября 2009

Я выполняю функцию поиска по тегам, пользователь может наблюдать много тегов, я получаю все это в одном кортеже, и теперь я хотел бы найти весь текст, который включает хотя бы один тег из списка.
Символическое: text__contains__in=('asd','dsa')
Моя единственная идея - сделать цикл, например ::1004*

q = text.objects.all() 

for t in tag_tuple: 
   q.filter(data__contains=t)

Например: входной набор тегов, ('car', 'cat', 'cinema') выводить все сообщения, содержащие хотя бы одно слово из этого кортежа, поэтому My cat is in the car, cat is not allowed in the cinema, i will drive my car to the cinema Спасибо за помощь!

Ответы [ 2 ]

9 голосов
/ 17 ноября 2009

Вот, пожалуйста:

filter = Q()
for t in tag_tuple: 
   filter = filter | Q(data__contains=t)
return text.objects.filter(filter)

Пара советов:

  • Вы должны называть свои классы моделей заглавными буквами (т.е. Text, а не text)
  • Возможно, вы захотите __icontains вместо этого, если вас не волнует дело
0 голосов
/ 14 ноября 2009

Я не знаю Django, поэтому я не знаю, как применить этот фильтр, но, похоже, вам нужна такая функция:

def contains_one_of(tags, text):
    text = text.split()   # tags should match complete words, not partial words
    return any(t in text for t in tags)
...