3차 나홀로 프로젝트 DRF 적응기 진행 중

Johnywhisky·2021년 7월 17일
0

프로젝트

목록 보기
1/1

Django Rest Framework

또 다른 Framework...?

프레임워크 속 프레임워크 django-rest-framework를 접하게 되었다. 기존 장고는 Model-View-Template의 패턴을 따랐다면(물론 template은 거의 안쓰이지만...) DRF는 Model-Serializer-View 패턴을 따라 진행된다는 차이점이 있다. 여기서 Serializer는 정말 강력하고 편리한 기능을 제공해 주는 녀석이다.(물론 그만큼 쓰려면 충분한 이해가 필요하지만...) 이 Serializer class는 우리가 요청에 대한 적절한 응답으로 보내줘야할 데이터의 model과 expression을 잘 선언해주면 알아서 시리얼라이징된 요소의 집합을 반환해준다.

  • Serializer
class DrinkListSerializer(ModelSerializer):
    
    discounted_price = SerializerMethodField()
    reviews          = SerializerMethodField()
    sell             = SerializerMethodField()
    
    class Meta:
        model = Product
        fields = (
            'id',
            'name',
            'price',
            'discount_rate',
            'discounted_price',
            'made_in',
            "reviews",
            'thumbnail_img_url',
            'sell'
            )
    
    def get_discounted_price(self, obj):
        return ceil(obj.price * (100 - obj.discount_rate) / 100)
    
    def get_reviews(self, obj):
        return len(obj.user_review.all())
    
    def get_sell(self, obj):
        return obj.salesrate.quantity
  • View
class DrinkListView(APIView):
    
    pagination_class = DrinkbyCountryPaginator
    serializer_class = DrinkListSerializer
    
    def get(self, request):
        try:
            queryset = Product.objects.all()
            category = request.GET.get("category")
            ordering = request.GET.get("ordering")
            
            if not category and not ordering:
                raise HttpResponseBadRequest
            
            drinks = get_list(queryset, category, ordering)
            
            paginated  = self.paginate_queryset(drinks)
            serialized = self.serializer_class(paginated, many = True).data
            if paginated is not None:
                return self.get_paginated_response(serialized)
            return Response(serialized, status = status.HTTP_200_OK)
        
        except RuntimeError:
            raise HttpResponseBadRequest
            
        except TypeError:
            raise Http404
        
    @property
    def paginator(self):
        if not hasattr(self, '_paginator'):
            if self.pagination_class is None:
                self._paginator = None
            else:
                self._paginator = self.pagination_class()
        return self._paginator
    
    def paginate_queryset(self, queryset):
        if self.paginator is None:
            return None
        return self.paginator.paginate_queryset(queryset, self.request, view=self)

    def get_paginated_response(self, data):
        assert self.paginator is not None
        return self.paginator.get_paginated_response(data)

기본적인 get method에 대한 view 작성은 어느정도 했으니 이제 cart로 넘어가 serializer를 이용한 C.R.U.D View를 제대로 작성해봐야겠다.

profile
안녕하세요 :) 1년 차 Pythonist 백엔드 개발자 윤서준입니다.

0개의 댓글