source

장고 ORM 쿼리에서 SQL ''LIKE''에 해당하는 것은 무엇입니까?

nicesource 2023. 6. 13. 22:24
반응형

장고 ORM 쿼리에서 SQL ''LIKE''에 해당하는 것은 무엇입니까?

다음에 해당하는 것은 무엇입니까?SQL의 진술.Django?

SELECT * FROM table_name WHERE string LIKE pattern;

시도해 봤습니다.

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

하지만 그것은 작동하지 않았다.어떻게 구현할 수 있습니까?

사용자 또는 (대소문자 구분 안 함):

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

SQL 등가물은 다음과 같습니다.

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

@아래 Dmitri의 답변은 'pattern%' 또는 '%pattern'과 같은 패턴을 다룹니다.

contains and icontains는 가짜 tru make 쿼리에 의해 언급되었습니다.SELECT ... WHERE headline LIKE '%pattern%

그들과 함께, 당신은 유사한 행동을 가진 이것들이 필요할 수 있습니다: 시작, 시작, , .

만들기

SELECT ... WHERE headline LIKE 'pattern%

또는

SELECT ... WHERE headline LIKE '%pattern

이것은 장고의 사용자 정의 검색을 통해 수행할 수 있습니다.저는 장고와 같은 룩업 애플리케이션으로 룩업했습니다.설치한 후에__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
result = table.objects.filter(string__icontains='pattern')

필드에서 문자열을 대소문자를 구분하지 않는 검색입니다.

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

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

전체 예제 : 문자열 필드 이름 file_name을 가진 DjangTable이라는 테이블이 있고 mysql의 문자열 file_name에 있는 공간과 일치하는 쿼리에 해당하는 Django 필터를 생성하려고 합니다.

SELECT * FROM DjangTable WHERE file_name LIKE '% %' 
class DjangTable(UTModel):


    ...
    file_name = models.CharField(max_length=255, null=False)
    ...

파이썬을 사용하는 장고에서는 다음과 같습니다.

pattern = ' ' # same as mysql LIKE '% %'
DjangTable.objects.filter(file_name__contains=pattern)

언급URL : https://stackoverflow.com/questions/18140838/what-is-the-sql-like-equivalent-on-django-orm-queries

반응형