django에서 대소문자 구분하지 않고 검색하기

django에서 대소문자를 구분하지 않고 검색하는 방법에 대해서 알아본다.

기본적으로 db 자체 설정으로 대소문자를 구분하지 않는 방법도 있지만 본 여기에서는 고려하지 않는다.


from appname.models import kaka

query_list = ['ronaldo', 'pizza']
results = kaka.objects.none()

for query in query_list:
    results |= kaka.objects.filter(q__iexact=query) #q:테이블 컬럼명

1: DB와 연동되어있는 클래스를 import 한다.
3: 검색하려는 질의들. 예를 들어, db에는 RONALDO라고 입력되어 있지만 ronaldo|Ronaldo|RONALDO로 검색했을 때 모두 같은 결과를 보고 싶은 경우
4: 검색 결과 값을 저장할 변수를 선언한다.
6~7: query_list에서 질의들을 하나씩 꺼내면서 filter 함수에 파라미터로 전달한다. 이때 ‘q__iexact’는 테이블 상에서 ‘q’ 라는 컬럼에서 대소문자를 구분하지 않고 filtering 한다는 뜻이다.

위와 같은 방식으로 대소문자를 구분하지 않고 검색하게 되면 속도는 체감할 수 있을 정도로 느려진다.
sqlite3 718,000개 데이터 기준으로
대소문자 구분하는 검색은 0.000687122344971,
대소문자 구분하지 않는 검색(위 방법)은 0.00111413002014가 걸렸다.
대소문자 구분하는 검색이 1.6배 정도 빠른 것이다.

위 환경은 DB 자체의 환경설정에서 대소문자를 구분한다는 전제 하에 진행한 것이고 대소문자를 구분하지 않는 방식으로 DB를 세팅했을 때, django 코드에서 대소문자를 구분하고 싶다면 다음과 같이 하면 된다.

kaka.objects.filter(q__exact=query) #q:테이블 컬럼명

대소문자 구분 O: 컬럼명__exact,
대소문자 구분 X: 컬럼명__iexact