Afin de préserver l'ordre des mots comme dans l'instruction sql LIKE '%pattern%', j'utilise l'iregex, par exemple :
qs = table.objects.filter(string__iregex=pattern.replace(' ', '.*'))
Les méthodes de chaîne de caractères sont immuables, de sorte que votre variable de motif ne changera pas. Avec .*, vous recherchez 0 occurrence ou plus de n'importe quel caractère, à l'exception des sauts de ligne.
En utilisant ce qui suit pour itérer sur les mots modèles :
qs = table.objects
for word in pattern.split(' '):
qs = qs.filter(string__icontains=word)
l'ordre des mots dans votre modèle ne sera pas préservé, pour certaines personnes cela pourrait fonctionner mais dans le cas d'essayer d'imiter l'instruction sql like je vais utiliser la première option.