171 votes

équivalent sql "LIKE" dans une requête django

Quel est l'équivalent de cette instruction SQL dans django ?

SELECT * FROM table_name WHERE string LIKE pattern;

Comment puis-je implémenter cela dans django ? J'ai essayé

result = table.objects.filter( pattern in string )

Mais cela n'a pas fonctionné. Comment puis-je le mettre en œuvre ?

318voto

falsetru Points 109148

Utilisez __contains o __icontains (insensible à la casse) :

result = table.objects.filter(string__contains='pattern')

L'équivalent SQL est

SELECT ... WHERE string LIKE '%pattern%';

@Dmitri's réponse ci-dessous couvre les modèles tels que "pattern%" ou "%pattern".

55voto

Dmitriy Kuznetsov Points 681

Contient et icontains mentionnés par falsetru faire des requêtes comme SELECT ... WHERE headline LIKE '%pattern%

Avec eux, vous pourriez avoir besoin de ceux qui ont un comportement similaire : commence par , e commence par , se termine par , iends avec

réalisation de

SELECT ... WHERE headline LIKE 'pattern%

ou

SELECT ... WHERE headline LIKE '%pattern

29voto

Petr Dlouhý Points 518

Cela peut être fait avec Recherches personnalisées de Django . J'ai transformé la consultation en un Application de consultation de type Django . Après l'avoir installé, le __like avec le % y _ les caractères génériques seront activés.

Tout le code nécessaire dans l'application est :

from django.db.models import Lookup
from django.db.models.fields import Field

@Field.register_lookup
class Like(Lookup):
    lookup_name = 'like'

    def as_sql(self, compiler, connection):
        lhs, lhs_params = self.process_lhs(compiler, connection)
        rhs, rhs_params = self.process_rhs(compiler, connection)
        params = lhs_params + rhs_params
        return '%s LIKE %s' % (lhs, rhs), params

9voto

Venkat Kotra Points 2697
result = table.objects.filter(string__icontains='pattern')

Recherche insensible à la casse d'une chaîne de caractères dans un champ.

4voto

Roderich25 Points 66

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X