Python/DRF

[DRF] Mixins로 CRUD 구현하기

emhaki 2023. 1. 12. 16:20
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()

APIView와 마찬가지로 동일한 모델을 생성해준다.

 

serializers.py

from .models import Blog
from rest_framework import serializers

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

serializer역시 동일하게 생성해준다.

 

views.py

from .models import Blog
from .serializer import BlogSerializer
from rest_framework import generics
from rest_framework import mixins

# Blog의 목록을 보여주는 역할
class BlogList(mixins.ListModelMixin,
                mixins.CreateModelMixin,
                generics.GenericAPIView):
    queryset = Blog.objects.all()
    serializer_class = BlogSerializer

    # Blog list를 보여줄 때
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    # 새로운 Blog 글을 작성 할 때 
    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

# Blog의 detail을 보여주는 역할
class BlogDetail(mixins.RetrieveModelMixin,
                mixins.UpdateModelMixin,
                mixins.DestroyModelMixin,
                generics.GenericAPIView):
    queryset = Blog.objects.all()
    serializer_class = BlogSerializer

    # Blog의 detail 보기
    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)
    
    # Blog 수정하기
    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)
    
    # Blog 삭제하기
    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)

한 눈에 봐도 이전의 APIView보다 코드가 줄어든 것이 보인다. 그 이유는 BlogList, BlogDetail 클래스에서 알 수 있듯이 상속을 많이 받기 때문인데 이러한 상속을 CBV 상속이라고 한다. 

동일하게 서버에 접속하면 위와 같이 나오게 되고,  Mixins를 사용하게 되면 APIView를 사용했을 때보다 더욱 간단하게 CRUD를 구현할 수 있게 된다.

 

참고

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

728x90
반응형