Python/DRF

[DRF] ViewSets으로 CRUD 구현하기

emhaki 2023. 1. 12. 22:45
728x90
반응형
SMALL

models.py

from django.db import models
from django.conf import settings

# Create your models here.

class Blog(models.Model):
  title = models.CharField(max_length=100)
  body = models.TextField()

동일하게 모델은 이전과 동일하다.

serializers.py

from .models import Blog
from rest_framework import serializers

class BlogSerializer(serializers.ModelSerializer):
    class Meta:
        model = Blog
        fields = '__all__'

views.py

from .models import Blog
from .serializer import BlogSerializer
from rest_framework import viewsets

# Blog의 목록, detail 보여주기, 수정하기, 삭제하기 모두 가능
class BlogViewSet(viewsets.ModelViewSet):
    queryset = Blog.objects.all()
    serializer_class = BlogSerializer

ViewSet의 코드 내부를 살펴보면 우리가 Mixins를 사용했던 코드들이 들어가 있다. 즉, ViewSet은 Mixins 코드를 상속받고 있다. CreateModelMixin, RetrieceModelMixin, UpdateModelMixin, DestroyModelMixin 등 CRUD의 기능을 하는 다양한 클래스를 상속받는 것을 확인할 수 있다.

urls.py

ViewSet의 경우에는 하나의 class에 Blog 목록과 detail을 보여주는 기능이 모두 존재하는데, 이를 하나의 path 함수로 표현할 수 없다. 왜냐하면 Blog 목록을 보여주는 url의 경우에는 pk 값이 필요가 없지만, detail을 보여주기 위해서는 pk값이 필요하기 때문이다.
따라서 ViewSet을 사용하기 위해서는 서로 다른 path 함수를 하나로 묶어주는 과정이 필요하다.

as_view()함수 활용

from django.urls import path
from .views import BlogViewSet

# Blog 목록 보여주기
blog_list = BlogViewSet.as_view({
    'get': 'list',
    'post': 'create'
})

# Blog detail 보여주기 + 수정 + 삭제
blog_detail = BlogViewSet.as_view({
    'get': 'retrieve',
    'put': 'update',
    'delete': 'destroy'
})

urlpatterns = [
  path('blog/', blog_list),
  path('blog/<int:pk>/', blog_detail),
]

as_view() 함수를 활용해서 mapping 관계를 처리해준다.

지금까지 APIView, Mixins, Generic CBV, ViewSet으로 CRUD를 구현해보았다. 확실히 상속받은 클래스를 활용하는 ViewSet을 사용하면 코드가 많이 줄어드는 것을 확인할 수 있었다.

참고
https://wisdom-990629.tistory.com/m/entry/DRF-APIView%EB%A1%9C-CRUD-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0

728x90
반응형