[DRF] xxxAPIView 소스 구조

Jinhyung Rhee·2022년 8월 12일
0

기존 api2의 출력 결과 (동일한 serializer = PostSerializer 사용)

  • PostListAPIView

  • PostRetrieveAPIView

→ PostRetrieveAPIView는 Post에 대한 더 많은 정보를 담아서 내보내야 하므로, Serializer를 분리할 필요가 있음!

서로 다른 Serializer 적용

  • views.py
from rest_framework.generics import ListAPIView, RetrieveAPIView, CreateAPIView
from blog.models import Post, Comment
from .serializers import CommentSerializer, PostListSerializer, PostRetrieveSerializer

class PostListAPIView(ListAPIView):
  queryset = Post.objects.all()
  serializer_class = PostListSerializer

class PostRetrieveAPIView(RetrieveAPIView):
  queryset = Post.objects.all()
  serializer_class = PostRetrieveSerializer

class CommentCreateAPIView(CreateAPIView):
  queryset = Comment.objects.all()
  serializer_class = CommentSerializer
  • serializers.py
from django.contrib.auth.models import User
from rest_framework import serializers
from blog.models import Post, Comment

# Serializers define the API representation.
class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ['url', 'username', 'email', 'is_staff']

class PostListSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        # fields = '__all__'
        fields = ['id', 'title', 'image', 'like', 'category']

class PostRetrieveSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        # fields = '__all__'
        exclude = ['create_dt']

class CommentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Comment
        fields = '__all__'
        # fields = ['id', 'title', 'image', 'like', 'category']
  • 결과
    • TODO : category와 tags의 결과값이 pk값이 아닌 이름으로 나오도록 변경!

CreateAPIView

  • POST 메서드만 처리 가능한 APIView

소스코드(cdrf) : post -> create(CreateModelMixin)

  • create() : 실제 로직을 수행하는 메서드
  • create 메서드는 CreateModelMixin 클래스에 정의되어 있음
  • 즉, CreateAPIView는 CreateModelMixin 클래스를 상속받음으로써(=CreateModelMixin에서 제공하는 기능을 포함함으로써) create 기능을 수행함!

상속계층도

  • CreateAPIView에서 CreateModelMixin을 상속받고 있음
    • CreateAPIView -> post()
    • CreateModelMixin -> create()

ListAPIView

  • GET 메서드만 처리하는 APIView

소스코드(cdrf) : get -> list(ListModelMixin)

  • list() : 실제 로직을 수행하는 메서드
  • list 메서드는 ListModelMixin 클래스에 정의되어 있음

상속계층도

  • ListAPIView에서 ListModelMixin 클래스를 상속받고 있음!

UpdateAPIView

  • PUT, PATCH 메서드를 처리하는 APIView

소스코드1(cdrf) : patch -> partial_update(UpdateModelMixin)

  • partial_updateupdate메서드의 차이점
    • partial_updatekwargs['partial'] = True로 해서 update 메서드를 호출함
    • 즉, kwargs['partial'] = True, kwargs['partial'] = False 차이!

소스코드2 : put -> update(UpdateModelMixin)

  • update 로직에서는 serialize할 때, partial argument를 사용(partial=partial)하고 있음!
  • partial인자가 True인 경우에는, 필수 속성(=필드)이 없더라도 update 가능
    • PATCH(=True) : 필수 속성이 모두 담겨 있지 않아도 update 가능
    • PUT(=False) : 필수 속성이 모두 담겨 있어야 update 가능

Serializer에서의 partial_update

  • Partial_update (link)
    # Update `comment` with partial data
    serializer = CommentSerializer(comment, data={'content': 'foo bar'}, partial=True)
    • 여기도 마찬가지로 partial=True이면 모든 인자가 없더라도 partial update가 가능함!

Reference

https://www.inflearn.com/course/%EC%9E%A5%EA%B3%A0-drf/dashboard

profile
기록하는 습관

0개의 댓글