현제의 현재이야기

[0130 TIL]Django REST Framework 핵심사항 본문

DRF

[0130 TIL]Django REST Framework 핵심사항

현재의 현제 2023. 1. 30. 16:07
  • 모델을 상속받을 때는 modelserializer를 사용하고 직접 필드를 정의할 때는 그냥 serializer를 사용한다.
  • Nested serializer 사용하는 법: 두 개의 시리얼라이저를 만들고 이렇게 many=True로 묶어둔다.

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)

class CateTagSerializer(serializers.Serializer):
    cateList = serializers.ListField(child=serializers.CharField())
    tagList = serializers.ListField(child=serializers.CharField())

views.py

class CateTagAPIView(APIView):
    def get(self, request, *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

from django.urls import path

from api2 import views

urlpatterns = [
    # path('post/', views.PostListAPIView.as_view(), name='post-list'),
    # path('post/<int:pk>/', views.PostRetrieveAPIView.as_view(), name='post-detail'),
    # path('comment/', views.CommentCreateAPIView.as_view(), name='comment-list'),
    # path('post/<int:pk>/like/', views.PostLikeAPIView.as_view(), name='post-like'),
    # path('catetag/', views.CateTagAPIView.as_view(), name='catetag'),

    path('post/', views.PostViewSet.as_view(actions={
        'get': 'list',
    }), name='post-list'),
    path('post/<int:pk>/', views.PostViewSet.as_view(actions={
        'get': 'retrieve',
    }), name='post-detail'),
    path('post/<int:pk>/like/', views.PostViewSet.as_view(actions={
        'get': 'like',
    }), name='post-like'),

    path('comment/', views.CommentViewSet.as_view(actions={
        'post': 'create',
    }), name='comment-list'),

    path('catetag/', views.CateTagAPIView.as_view(), name='catetag'),
]
  • 시리얼라이저에서 카테고리의 pk가 아니라 이름을 얻고 싶으면 (source='~~.~~')를 이용해서 오버라이딩한다. 
class PostListSerializer(serializers.ModelSerializer):
    category = serializers.CharField(source='category.name')

    class Meta:
        model = Post
        # fields = '__all__'
        fields = ['id', 'title', 'image', 'like', 'category']
  • 시리얼라이저를 안 쓰는 것도 가능하다.
class PostRetrieveAPIView(RetrieveAPIView):
    # queryset = Post.objects.all()
    # serializer_class = PostSerializerDetail

    def get_queryset(self):
        return Post.objects.all().select_related('category').prefetch_related('tags', 'comment_set')

    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        # prevInstance, nextInstance = get_prev_next(instance)
        commentList = instance.comment_set.all()

        postDict = obj_to_post(instance)
        prevDict, nextDict = prev_next_post(instance)
        commentDict = [obj_to_comment(c) for c in commentList]

        dataDict = {
            'post': postDict,
            'prevPost': prevDict,
            'nextPost': nextDict,
            'commentList': commentDict,
        }

        return Response(dataDict)

select_related('')와 prefetch_related()에 대한 설명

 

select related, prefetch related 그리고 debug toolbar

select related, prefetch related and debug toolbar

blog.myungseokang.dev

_set의 의미

article = Article.objects.get(pk=?)
article.comment_set.all()
= Article.objects.get(pk=?).comment_set.all()

출처: https://coder-in-war.tistory.com/entry/Python-06-Django-relation-1N-복습

다 듣긴 했는데 한번 만들어보면서 익혀봐야겠다. 공식 문서 참조해서 오버라이딩 하는 게 좀 빡세보이지만 코드 예쁘게 짜서 이번 프로젝트에 적용시켜 보고 싶다.

 

Nested serializer 쉬운 방법

https://ninefloor-design.tistory.com/257

 

'DRF' 카테고리의 다른 글

[TIL] Many to Many에 대한 고찰  (0) 2023.01.30
[0129 TIL]Django REST Framework 핵심사항  (0) 2023.01.30
DRF 공부  (0) 2023.01.15
Comments