[샤넬 프로젝트] 필터 기능 구현

hyuckhoon.ko·2020년 7월 1일
0

What I learned in wecode

목록 보기
64/109

샤넬 프로젝트에서 샤넬 백 제품의 필터기능이 필요했다.

정말정말 큰 도움이 된 자료는 아래 두 가지다.

1. 참고자료

[1]. 프론트엔드의 쿼리셋이 오는 방식


출처 : https://groups.google.com/forum/#!topic/django-users/bAeibYUzAJg



[2]. (views.py) 필터 로직 구현을 위한 dictionary 활용 방식

출처 : https://able.bio/dfernsby/optional-filters-with-django-querysets--86k2av4






2. Postman의 Param 설정 방법

  • 아래 그림과 같이 Param탭에 KEY, VALUE를 각각 지정하였다.
    중요한 점은, collection_id__in이라는 KEY가 맨 위에, 그리고 가장 아래 각각 작성되었다는 점이다.

다시 말해서, collection_id__in : ['1', '3'] 과 같이
입력해서는 안 된다.

결과






3. views.py

class BagView(View):
  12     def get(self, request):
  13         total_bag_info    = []
  14         collection_option = request.GET.getlist('collection_id__in')
  15         theme_option      = request.GET.getlist('theme__in')
  16         shape_option      = request.GET.getlist('shape__in')
  17         material_option   = request.GET.getlist('material__in')
  18
  19         filters                      = {}
  20         filters['collection_id__in'] = collection_option
  21         filters['theme__in']         = theme_option
  22         filters['shape__in']         = shape_option
  23         filters['material__in']      = material_option
  24
  25         new_filters = {}
  26         for key, value in filters.items():
  27             if value:
  28                 new_filters[key] = value
  29
  30         bag_list = Product.objects.filter(
  31             name__contains="CHANEL 19"
  32         ).prefetch_related(
  33                             'texture',
  34                             'productimage_set'
  35         ).exclude(id__lt=400).filter(**new_filters)
  36
  37         total_bag_info = [
  38             {
  39                 'bag_code'          : bag.product_code.replace(' ',''),
  40                 'bag_img'           : bag.productimage_set.all()[0].url,
  41                 'bag_name'          : bag.name,
  42                 'bag_price'         : bag.price,
  43                 'texture'           : [texture.name for texture in bag.texture.all()]
  44             } for bag in bag_list
  45         ]
  46         return JsonResponse({'bag_info':total_bag_info}, status=200)

0개의 댓글