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
반응형
'Python > DRF' 카테고리의 다른 글
[DRF] 게시판 기능(CRUD) 구현하기 (0) | 2023.01.17 |
---|---|
[DRF] 커스텀 유저 구현하기(회원가입/로그인) (0) | 2023.01.14 |
[DRF] Generic CBV로 CRUD 구현하기 (0) | 2023.01.12 |
[DRF] Mixins로 CRUD 구현하기 (0) | 2023.01.12 |
[DRF] APIView로 CRUD 구현하기 (1) | 2023.01.12 |