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?
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:
__contains
Veya __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%';
%a%b%
.
result = table.objects.filter(string__contains='a').filter(string__contains='b')
ba
hangisi LIKE %a%b%
olmazdı.
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
result = table.objects.filter(string__icontains='pattern')
Bir alandaki dize için büyük / küçük harfe duyarlı olmayan arama.
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.
Bu, Django'nun özel aramaları ile yapılabilir . Aramayı Django benzeri bir arama uygulamasına yaptım . O yükledikten sonra __like
ile 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
result = table.objects.filter(string__icontains='pattern')