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

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

SELECT * FROM table_name WHERE string LIKE pattern;

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

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

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



답변

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

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

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

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


답변

falsetru가 언급 한 포함 및 icontains SELECT ... WHERE headline LIKE '%pattern%

그들과 함께 유사한 동작을 가진 다음이 필요할 수 있습니다 :
startswith , istartswith , endswith , iendswith

만들기

SELECT ... WHERE headline LIKE 'pattern%

또는

SELECT ... WHERE headline LIKE '%pattern


답변

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

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


답변

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 문을 모방하려는 경우 첫 번째 옵션을 사용합니다.


답변

이것은 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


답변