Django에서 더블 언더 스코어(__) 활용 방법 [20210912]

Jungsoo kim·2021년 9월 12일
2

wecode

목록 보기
24/30

어제 쓴 블로그 글에서 Django에서 더블언더스코어(__)의 사용법에 대해 한 가지 알아보았다.
필터링 하고자 하는 항목이 현재 테이블에 없고 연관 테이블에 있는 경우 더블언더 스코어를 사용하여 타고 넘어가는 방식이었는데, 더블언더 스코어의 활용 방법을 하나 더 알게 되어 이렇게 블로그 포스팅을 하게되었다.

<목차>
1. 발단
2. 활용법

1. 발단

  먼저 왜 더블언더 스코어를 활용하는 방식에 대해 궁금하게 되었는지 부터 간단하게 설명하자면 아래와 같다.

  우리의 클론프로젝트에는 장바구니 기능이 담겨있었는데, 장바구니에 담긴 물품을 전체 삭제하거나, 여러개의 품목중 다수의 제품을 삭제하는 기능을 구현하고자 하였다. 처음에는 path parameter등을 활용하여 접근을 해보았는데, 한 가지 제품 삭제만이 가능하였고, 다수의 제품을 삭제하는 것은 어려웠다. 그러던 도중에 다른 조의 한 분이 더블언더 스코어를 활용할 수 있다는 힌트를 주셨고, 우리는 그에 따라 구글링을 해서 추가 활용법을 알아낼 수 있었다.


위와 같이, 마켓컬리 장바구니에서는 다수의 제품을 선택하여 한 번에 삭제하는 기능이 구현되어 있었기 때문에, 우리도 이와 같은 기능을 구현하고 싶었다.

2. 활용법

  다수의 품목을 삭제하는 기능을 구현하는데 핵심적인 방법은 '여러개의 품목을 한 번에 필터링을 하는 것이 가능한 것인지?' 였다. 다행히도 Django는 여러개의 품목을 한 번에 필터링 하는 방법을 갖고 있었고 그 방식은 아래와 같다.

product_in_cart = Cart.objects.filter(product_id__in = selected_list, user_id = current_user_id)

위의 코드에는 product_id__in 코드를 볼 수있다. __in을 활용하게 되면 product_id라는 변수를 여러개로 받았을 경우 여러개의 변수를 반복해서 하나씩 받아올수 있다. 이해를 위해서 전체 코드를 아래와 같이 첨부하였다.

@authentication
    def delete(self, request):
        try:
            current_user_id = request.user
            selected_list   = request.GET.getlist('product-id')

            product_in_cart = Cart.objects.filter(product_id__in = selected_list, user_id = current_user_id)
            
            if not product_in_cart.exists():
                return JsonResponse( {'MESSAGE' : 'NO ITEM TO REMOVE'}, status = 400)

            product_in_cart.delete()

            return JsonResponse( {'MESSAGE' : 'SUCCESSFULLY DELETED'}, status = 200)
            
        except KeyError:
            return JsonResponse( {'MESSAGE' : 'KEY ERROR'}, status = 400)

  5번째 줄에서 request.GET.getlist('product-id')를 통해 selected_list 변수에 여러개의 값을 딕셔너리가 리스트에 담긴 형태로 받아올 수 있다. 간략하게 설명하면, GET은 request를 통해 보내진 데이터를 쿼리셋에서 각각의 쿼리 형태로 바꿔주며 getlist는 각각의 쿼리를 다시 딕셔너리 형태로 바꾸어 리스트 안에 담아준다. 즉, __in 메서드를 사용하는데 있어서 getlist는 핵심적인 기능을 한다.

따라서, 딕셔너리 형태로 변경된 값의 리스트인 selected_list변수를 filter 메서드를 통해 product_in_cart 변수에 담고 해당하는 값을 지워주는 방식이다.

  이번에는 getllist와 __in을 활용할 기회가 많지 않았지만, 앞으로 계속 Django를 사용하게 되면 정말 유용하게 많이 사용될 기능들인 것 같다고 느꼈다. 그래서 따로 블로그를 통해 남겨놓으려고 하는 것도 있다.
또한, 프레임워크에서 제공하는 기능이 어떤 것들이 있는지 파악하는 것이 정말 중요하고 마찬가지로 공식문서를 잘 찾아보는 것이 정말 중요하다는 것을 다시 한 번 깨닫게 되는 계기가 되었던 것 같다.
그럼 이만...

profile
어렵지만 꾸준히 차근차근 해 나가자~!

0개의 댓글