django sorgusunda sql "LIKE" eşdeğeri


109

Django'daki bu SQL ifadesinin eşdeğeri nedir?

SELECT * FROM table_name WHERE string LIKE pattern;

Bunu django'da nasıl uygularım? denedim

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

Ama bu işe yaramadı. Bunu nasıl uygularım?

Yanıtlar:


201

__containsVeya __icontains(büyük / küçük harfe duyarlı değil) kullanın :

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

SQL eşdeğeri

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

22
Ve büyük / küçük harfe duyarlı olmayan arama için __icontains ->result = table.objects.filter(string__icontains='pattern')
Garg

13
Bu cevap yalnızca olası modellerin bir alt kümesini kapsar. Böyle bir kalıbı ele almazdı %a%b%.
kasperd

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

1
@LS Bu eşleşecek bahangisi LIKE %a%b%olmazdı.
kasperd

2
Bu cevap, yukarıda belirtilen nedenlerden dolayı eksiktir. Ayrıca @ Dmitry'nin cevabındaki bilgileri de içermelidir.
medley56

34

falsetru tarafından belirtilen içerir ve ikonlar gibi sorgular yapar SELECT ... WHERE headline LIKE '%pattern%

: Onlarla birlikte, benzer davranışı ile bu olanları gerekebilir startswith , istartswith , endswith , iendswith

yapımı

SELECT ... WHERE headline LIKE 'pattern%

veya

SELECT ... WHERE headline LIKE '%pattern


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

Bir alandaki dize için büyük / küçük harfe duyarlı olmayan arama.


2
Güzel, ama aynı cevap neredeyse üç yıl önce verilmişti.
LS

3

Sql LIKE '% pattern%' ifadesinde olduğu gibi kelimelerin sırasını korumak için iregex kullanıyorum, örneğin:

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

dize yöntemleri değişmezdir, bu nedenle desen değişkeniniz değişmez ve. * ile herhangi bir karakterin 0 veya daha fazla oluşumunu, ancak satırları kesmeyi arayacaksınız.

Kalıp sözcüklerini yinelemek için aşağıdakileri kullanarak:

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

Kalıplarınızdaki kelimelerin sıralaması çalışabilecek bazı insanlar için korunmayacaktır, ancak sql benzeri ifadeyi taklit etmeye çalışmak durumunda ilk seçeneği kullanacağım.


2

Bu, Django'nun özel aramaları ile yapılabilir . Aramayı Django benzeri bir arama uygulamasına yaptım . O yükledikten sonra __likeile arama %ve _joker karakter etkinleştirilecek.

Uygulamadaki tüm gerekli kod:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.