l'equivalente sql "LIKE" nella query django


108

Qual è l'equivalente di questa istruzione SQL in django?

SELECT * FROM table_name WHERE string LIKE pattern;

Come lo implemento in Django? Provai

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

Ma non ha funzionato. Come lo implemento?

Risposte:


200

Usa __containso __icontains(senza distinzione tra maiuscole e minuscole):

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

L'equivalente SQL è

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

22
E per la ricerca senza distinzione tra maiuscole e minuscole usa __icontains ->result = table.objects.filter(string__icontains='pattern')
Hitesh Garg

13
Questa risposta copre solo un sottoinsieme dei possibili modelli. Non gestirebbe uno schema simile %a%b%.
Kasperd

@kasperd, prova:result = table.objects.filter(string__contains='a').filter(string__contains='b')
LS

1
@LS Quello corrisponderebbe a quello bache LIKE %a%b%non lo sarebbe.
Kasperd

2
Questa risposta è incompleta per i motivi sopra indicati. Dovrebbe anche includere le informazioni nella risposta di @ Dmitry.
medley56

34

contiene e icontains menzionati da falsetru fanno query come SELECT ... WHERE headline LIKE '%pattern%

Insieme a loro, potresti aver bisogno di questi con un comportamento simile: inizia con , istart con , finisce con , iendswith

fabbricazione

SELECT ... WHERE headline LIKE 'pattern%

o

SELECT ... WHERE headline LIKE '%pattern


9
result = table.objects.filter(string__icontains='pattern')

Ricerca senza distinzione tra maiuscole e minuscole per stringa in un campo.


2
Bello, ma la stessa risposta era già stata data quasi tre anni prima.
LS

3

Per preservare l'ordine delle parole come nell'istruzione sql LIKE '% pattern%' utilizzo iregex, ad esempio:

qs = table.objects.filter(string__iregex=pattern.replace(' ', '.*'))

i metodi stringa sono immutabili quindi la variabile del modello non cambierà e con. * cercherete 0 o più occorrenze di qualsiasi carattere tranne le linee di interruzione.

Utilizzando quanto segue per scorrere le parole del modello:

qs = table.objects
for word in pattern.split(' '):
    qs = qs.filter(string__icontains=word)

l'ordine delle parole nel tuo pattern non sarà preservato, per alcune persone che potrebbero funzionare, ma nel caso di provare a imitare l'istruzione sql like userò la prima opzione.


2

Questo può essere fatto con le ricerche personalizzate di Django . Ho trasformato la ricerca in un'applicazione di ricerca simile a Django . Dopo l'installazione verrà abilitata la __likericerca con i caratteri jolly %e _.

Tutto il codice necessario nell'applicazione è:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.