본문 바로가기
Python/Django

[DRF] ModelSerializer와 CreateModelMixin 사용하기

by 코드뭉치 2023. 6. 6.

ModelSerializer

 

  • 기본적으로 Serializer를 상속.
  • .create() 및 .update() 메소드 제공
  • serializer에 대한 validator(예: unique_together validator)를 자동으로 생성

 

예시) title과 content가 있는 Article 모델

from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=25)
    content = models.CharField(max_length=25)

 

ModelSerializer를 사용해 ArticleSerializer 생성

from rest_framework import serializers
from .models import Article

class ArticleSerializer(serializers.ModelSerializer):
    length = serializers.SerializerMethodField()

    def get_length(self, obj):
        return len(obj.content)

    class Meta:
        model = Article
        exclude = ['id']

 

ModelSerializer는 CreateModelMixin과 사용하면 더 간결하게 코드를 작성할 수 있다.

from rest_framework.generics import GenericAPIView
from rest_framework.mixins import ListModelMixin, CreateModelMixin
from .models import Article
from .serializers import ArticleSerializer

class ArticleListGenericView(GenericAPIView, ListModelMixin, CreateModelMixin):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

 

그냥 APIView를 사용했을 때

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Article
from .serializers import ArticleSerializer

class ArticleListAPIView(APIView):
    def get(self, request, *args, **kwargs):
        articles = Article.objects.all()
        serializer = ArticleSerializer(articles, many=True)
        return Response(serializer.data)

    def post(self, request, *args, **kwargs):
        serializer = ArticleSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

확실히 get과 post 메소드의 코드들이 GenericAPIView를 사용한 경우에 더 간결한 것을 확인할 수 있다.

댓글