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에도 달아줘서 테스트가 가능하다.


'회고록(TIL&WIL)' 카테고리의 다른 글
TIL 2022.08.09 프로젝트 DRF Test Code (0) | 2022.08.09 |
---|---|
TIL 2022.08.08 DRF ORM 쿼리 최적화 select_related, prefecth_related, F method, transaction (0) | 2022.08.08 |
WIL 2022.08.05 SIDE PRO - KPT 회고 (0) | 2022.08.08 |
TIL 2022.07.22 알고리즘 강의 정리 (0) | 2022.07.22 |
TIL 2022.07.21 Django 북마크(좋아요)기능 (0) | 2022.07.21 |