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