Para preservar el orden de las palabras como en la declaración sql LIKE '% pattern%' utilizo iregex, por ejemplo:
qs = table.objects.filter(string__iregex=pattern.replace(' ', '.*'))
Los métodos de cadena son inmutables, por lo que su variable de patrón no cambiará y con. * buscará 0 o más apariciones de cualquier carácter excepto líneas de corte.
Usando lo siguiente para iterar sobre las palabras del patrón:
qs = table.objects
for word in pattern.split(' '):
qs = qs.filter(string__icontains=word)
el orden de las palabras en su patrón no se conservará, para algunas personas eso podría funcionar, pero en el caso de intentar imitar la instrucción sql like, usaré la primera opción.
result = table.objects.filter(string__icontains='pattern')