views:

223

answers:

2

I am doing tag search function, user could observe a lot of tags, I get it all in one tuple, and now I would like to find all text which include at least one tag from the list.
Symbolic: text__contains__in=('asd','dsa')
My only idea is do loop e.g.:

q = text.objects.all() 

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

EDIT: Now I see it is bad idea doing loop that way... (It will filter text with all tags inside) Is there any works idea?

EDIT: for example: input tuple of tags, ('car', 'cat', 'cinema') output all messages what contains at least one word from that tuple, so My cat is in the car , cat is not allowed in the cinema, i will drive my car to the cinema Thanks for help!

A: 

I don't know Django, so I have no idea how to apply this filter, but it seems you want a function like this one:

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)
Stephan202
+4  A: 

Here you go:

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

A couple of tips:

  • You should be naming your model classes with a capital (i.e. Text, not text)
  • You may want __icontains instead if you're not worried about the case
SmileyChris
Nice if it will work, looks simple, thx +1 and accepted answer :)
Rin