티스토리 뷰

반응형

기본적으로 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

 

반응형