본문 바로가기

회고록(TIL&WIL)

TIL 2022.08.08 DRF Q method(검색 기능 구현), query debugger

Q method

여러가지의 조건에 해당하는 값을 조회하기 위한 method 검색기능을 이용할 때 사용할 떄 유용하다.

우리 프로젝트에서는 태그를 완성한 다음 검색을 진행하기 때문에 많은 기능은 이용하지 않고 단순히 or 구문만 이용해서 검색기능을 만들었다.

from django.db.models import Q

# project/
class ProjectAPIView(APIView, PaginationHandlerMixin):

...
    
    # 모든 게시물 출력
    def get(self, request):
        filter = request.GET.get("filter", None)
        skills = request.GET.getlist("skills", None)
        print(skills)
        # 검색
        if skills != None:
            q = Q()
            for skill in skills:
                q.add(Q(skills__name=skill), q.OR)
                project = Project.objects.filter(q)
                return self.pagination(project)
 ...

__icontains : 단어의 일부를 입력받아도 검색이 가능하도록 함
.distinct() : 중복된 행을 제거한 후 출력하도록 함


query debugger

모든 쿼리에 대해서 총 몇개의 쿼리가 실행되었고 시간소요가 얼마나 되었는지 확인 가능

# query_util.py
from django.db import connection, reset_queries
import time
import functools

def query_debugger(func):
    @functools.wraps(func)
    def inner_func(*args, **kwargs):
        reset_queries()

        start_queries = len(connection.queries)

        start = time.perf_counter()
        result = func(*args, **kwargs)
        end = time.perf_counter()
        
        end_queries = len(connection.queries)
        print(f"------------------------------------------------------")
        print(f"Function : {func.__name__}")
        print(f"Number of Queries : {end_queries - start_queries}")
        print(f"Finished in : {(end - start):.6f}s")
        print(f"------------------------------------------------------")
        return result

    return inner_func

쿼리문을 검증할 함수위에 @query_debug 어노테이션을 달아주면 아래와 같이 검증이 가능하다.

실제로 작동되는 views.py 의 코드도 되고 test code에도 달아줘서 테스트가 가능하다.