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()과 같다.
편리하고 확장성 면에서 유용하다.
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 정의서에 공유해주면 보다 명확한 코드가 된다.