[BAGETTT] 상품페이지 API

LILO Ghim·2021년 12월 12일
0

PackagesListView

코드가 거의 1/3로 줄어들었던 애증의 상품리스트 페이지

  • 브랜드 이름으로 필터링, 가격순으로 정렬을 해야 했고, 중복이 가능하도록
  • front-end에 보내야 하는 데이터 중에 하나의 패키지에 포함된 각 제품의 브랜드 이름을 함께 담아 보내야 했다

이 하나의 view에 적용해야 했던 새로운 개념들은
1) query parameter
2) request.GET.getlist/request.GET.get
3) q = Q()
4) __in
5) filter(q).order_by()
6) distinct

이 모든 것의 총집합은 브랜드 검색 if문/가격순 정렬의 if문/default문을 모두 정리하게 해줬던 눈물과 고통의 api였던,,,!

class PackagesListView(View):
    def get(self, request):   
        
        brand     = request.GET.getlist('brand', None)
        ordering  = request.GET.get('order', 'id')
        
        q = Q()

        if brand:
            q &= Q(products__brand_name__in = brand)
            
        packages = Package.objects.filter(q).order_by(ordering).distinct()
        
        results = [{
            "id"    : package.id,
            "name"  : package.name,
            "image" : package.thumbnail_image,
            "price" : package.price,
            "brand" : [product.brand_name for product in package.products.all()],
        } for package in packages]

        return JsonResponse({'result':results}, status=200)
profile
킴릴로

0개의 댓글