#15 Django - Quary parameter

박종규·2021년 8월 8일
1

TIL

목록 보기
16/22

Q 객체

quary parameter를 받아 DB의 데이터를 Q객체를 이용하여 필터링하고 값을 추출하는 경우의 코드이다.

처음 작성한 코드


if brand_id or type_id:
	products = Product.objects.filter(Q(brand=brand_id) | Q(type=type_id))
else:
	products = Product.objects.all()

수정한 코드

q = Q()

if brand_id:
	q &= Q(brand=brand_id)

if type_id:
	q &= Q(type=type_id)
    
products = Product.objects.filter(q)

q객체에 아무것도 없을 경우, all()과 같다.
편리하고 확장성 면에서 유용하다.

Dictionary를 이용한 parameter decode

filter   = request.GET.get("filter","id")

products = Product.objects.filter(q).order_by(filter))]

parameter를 이용해서 필터를 적용할 때,
위와 같이 구성할 경우, 프론트에서 db column 데이터 정보를 직접
지정해주어야한다.
(ex. 가격순 price, 최신순 -register_date)

filter   = request.GET.get("filter")

product_prefixes = {
                "best"   : "-like_number",
                "recent" : "-register_date",
                "old"    : "register_date"
            }
products = Product.objects.filter(q).order_by(product_prefixes.get(filter, "id"))]

딕셔너리형태로 저장하고 API 정의서에 공유해주면 보다 명확한 코드가 된다.

0개의 댓글