Was ist einfachste Art und Weise verbinden __contains und __in?
-
20-09-2019 - |
Frage
Ich tue Tag Suchfunktion, könnten Benutzer eine Menge von Tags beobachten, ich alles in einem Tupel zu bekommen, und jetzt würde Ich mag alle Texte finden, die mindestens einen Tag aus der Liste enthalten.
Symbolisch: text__contains__in=('asd','dsa')
Meine einzige Idee ist, do-Schleife z.
q = text.objects.all()
for t in tag_tuple:
q.filter(data__contains=t)
Zum Beispiel:
Eingangstupel von Tags, ('car', 'cat', 'cinema')
mindestens eine Wortausgabe aller Nachrichten, welche von diesem Tupel enthält, so My cat is in the car
, cat is not allowed in the cinema
, i will drive my car to the cinema
Vielen Dank für die Hilfe!
Lösung
Hier gehen Sie:
filter = Q()
for t in tag_tuple:
filter = filter | Q(data__contains=t)
return text.objects.filter(filter)
Ein paar Tipps:
- Sie sollten Ihre Modellklassen mit einem Kapital (das heißt
Text
, nichttext
) werden Namensgebung
- Sie können wollen
__icontains
statt, wenn Sie über den Fall nicht besorgt sind
Andere Tipps
Ich weiß Django nicht, so dass ich keine Ahnung, wie diese Filter angewandt werden, aber es scheint, dass Sie eine Funktion wie diese wollen:
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)