티스토리 뷰
반응형
기본적으로 serializer의 출력을 했을 때, 포맷은 다음과 같다.
from api2.serializers import *
CommentSerializer()
>> id =IntegerField..
content CharField..
create_dt = DateTImeField..
직렬화는, Model instance에서 시리얼라이저, json data에서 byte data 순서로 바뀐다.
그러나 역직력화는 반대로 byte data에서 json data를 거쳐 시리얼라이저에서 해석해 model instace에 들어가게 된다.
따라서 다음과 같은 직렬화를 볼 수 있다.
python manage.py shell
from blog.models import *
comm = Comment.objects.first()
cs = CommentSerializer(instance=comm)
cs.data
>> {'id': 1, 'content': '아이슬란드에서 언제 어디에서 오로라를 볼 수 있을까요? 레이캬비크 어디에서 가장 잘 볼 수 있지요? 오로라를 보려면 아이슬란드에 얼마나 오래 머물러야 할까요?', 'create_dt': '2022-10-27T21:01:54.145250Z', 'update_dt': '2022-10-27T21:01:54.145250Z', 'post': 1}
json_data = cs.data
type(json_data)
>> rest_framework.utils.serializer_helpers.ReturnDict
from rest_framework.renderers import JSONRenderer
byte_data = JSONRenderer().render(json_data)
type(byte_data)
>>bytes
역직렬화
>>> from rest_framework.parsers import JSONParser
>>> from io import BytesIO
>>> json_data2 = JSONParser().parse(BytesIO(byte_data))
>>> type(json_data2)
dict
>>> cs2 = CommentSerializer(data=json_data2)
>>> cs2.is_valid() #true
>>> cs2.validated_data
{'content': '아이슬란드에서 언제 어디에서 오로라를 볼 수 있을까요? 레이캬비크 어디에서 가장 잘 볼 수 있지요? 오로라를 보려면 아이슬란드에 얼마나 오래 머물러야 할까요?',
'post': <Post: 아이슬란드 오로라 (Iceland Aurora)>}
>>> instance = Comment(**cs2.validated_data)
>>> instance.save()
http://localhost:8000/api/catetag/
해당하는 시리얼라이저를 만들어줘서 전달할 수 있게 한다.
반드시 직렬화를 해야 객체를 전달할 수 있다.
api2/serializers.py
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = ['name']
class TagSerializer(serializers.ModelSerializer):
class Meta:
model = Tag
fields = ['name']
class CateTagSerializer(serializers.Serializer):
# cateList = CategorySerializer(many=True)
# tagList = TagSerializer(many=True)
cateList = serializers.ListField(child=serializers.CharField())
tagList = serializers.ListField(child=serializers.CharField())
api2/views.py
from rest_framework.views import APIView
class CateTagAPIView(APIView):
def get(sefl, reqeust, *args, **kwargs):
cateList = Category.objects.all()
tagList = Tag.objects.all()
data = {
'cateList' : cateList,
'tagList' : tagList
}
serializer = CateTagSerializer(instance=data)
return Response(serializer.data)
urls.py
path('catetag/', views.CateTagAPIView.as_view(), name='catetag'),
http://localhost:8000/api2/catetag/
이러면 catetag까지 나오게 된다.
many=True와 ListField의 차이는 many의 경우, 하나씩 분리가 되고, ListField는 각 필드마다 묶여서 전달된다.
좋아요 기능 GET 방식으로 동작하기
api2/views.py
from rest_framework.generics import GenericAPIView
class PostLikeAPIView(GenericAPIView):
queryset = Post.objects.all()
def get(self, request, *args, **kwargs):
instance = self.get_object()
instance.like += 1
instance.save()
return Response(instance.like)
이러면 get만 눌러도 올라간다.
조회수를 올리는 걸로 사용할 수 있다.
pagenation
페이지화 한다.
api2/views.py
from rest_framework.pagination import PageNumberPagination
class PostPangeNumberPagination(PageNumberPagination):
page_size = 3
def get_paginated_response(self, data):
return Response(OrderedDict([
('pagCnt', self.page.paginator.num_pages),
('curPage', self.page.number),
('postList', data)
]))
class PostListAPIView(ListAPIView):
queryset = Post.objects.all()
serializer_class = PostListSerializer
pagination_class = PostPangeNumberPagination
반응형