Как проще всего объединить __contains и __in?
-
20-09-2019 - |
Вопрос
Я использую функцию поиска по тегам, пользователь может наблюдать множество тегов, я получаю все это в одном кортеже, и теперь я хотел бы найти весь текст, который включает хотя бы один тег из списка.
Символический: text__contains__in=('asd','dsa')
Моя единственная идея - сделать цикл, например:
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
Спасибо за помощь!
Решение
Держи, ты идешь:
filter = Q()
for t in tag_tuple:
filter = filter | Q(data__contains=t)
return text.objects.filter(filter)
Пара советов:
- Вы должны называть свои классы моделей с большой буквы (т.е.
Text
, неtext
) - Вы можете захотеть
__icontains
вместо этого, если вы не беспокоитесь о деле
Другие советы
Я не знаю 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)
Не связан с StackOverflow