django 쿼리에 해당하는 SQL“LIKE”


108

django에서이 SQL 문과 동등한 것은 무엇입니까?

SELECT * FROM table_name WHERE string LIKE pattern;

장고에서 어떻게 구현합니까? 나는 시도했다

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

그러나 그것은 작동하지 않았습니다. 어떻게 구현합니까?

답변:


200

사용 __contains또는 __icontains(대소 문자 구분) :

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

동등한 SQL은 다음과 같습니다.

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

22
그리고 대소 문자를 구분 검색 사용에 대한 __icontains ->result = table.objects.filter(string__icontains='pattern')
Hitesh Garg를

13
이 답변은 가능한 패턴의 일부만 다룹니다. 같은 패턴을 처리하지 않습니다 %a%b%.
kasperd

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

1
@LS 즉 일치합니다 ba어떤이 LIKE %a%b%없다.
kasperd

2
이 답변은 위에 명시된 이유로 불완전합니다. 또한 @Dmitry의 답변에 정보를 포함해야합니다.
medley56


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

필드의 문자열에 대한 대소 문자를 구분하지 않는 검색.


2
좋지만 거의 3 년 전에 같은 대답이 이미 주어졌습니다.
LS

3

sql LIKE '% pattern %'문에서와 같이 단어의 순서를 유지하기 위해 iregex를 사용합니다. 예를 들면 다음과 같습니다.

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

문자열 메서드는 불변이므로 패턴 변수는 변경되지 않으며. *를 사용하면 문자가 0 개 이상 발생하지만 줄 바꿈이 없습니다.

다음을 사용하여 패턴 단어를 반복합니다.

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

패턴의 단어 순서는 보존되지 않을 것입니다. 어떤 사람들은 작동 할 수 있지만 SQL like 문을 모방하려는 경우 첫 번째 옵션을 사용합니다.


2

이것은 Django의 사용자 정의 조회 로 수행 할 수 있습니다 . 나는 조회를 장고와 같은-조회 응용 프로그램 . 설치 후 및 와일드 카드를 __like사용한 조회 가 활성화됩니다.%_

애플리케이션에 필요한 모든 코드는 다음과 같습니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.