당신은 멋쟁이, 우리는 장고쟁이~

0%

DRF Tutorial 16편 - mixins 사용하기

Mixins 사용하기


클래스 기반 뷰를 사용하는것의 이점중 하나는, 어떠한 동작에 대해서 재사용할수 있는 코드를 작성할수 있다는 점입니다.


우리가 API 를 위해 이제까지 사용하고 있었던 create/retrieve/update/delete 동작들은, 일반 Django 에서 우리가 생성하는 모델이 뒷받침 해주는 API View 들 안에서도 굉장히 비슷하게 사용될수 있습니다.


이런 비슷한 동작들은, REST FRAMEWORK 의 mixin 클래스에 구현 되어 있습니다.


Mixins


객체 지향 프로그램 언어들 안에서,

mixin 은 메서드들을 포함하고 있는 하나의 클래스로, 메서드들은 다른 클래스들에 의해서 사용되는데,

다른 클래스가 mixin 에 있는 메서드를 사용하기 위해서, mixin class 가 해당 클래스의 부모 클래스가 될 필요는 없습니다.


때때로, Mixins 들은 상속 개념보다는, 포함된다는 개념으로 묘사되곤 합니다.


예를들면, mixin 클래스안에 있는 메서드를 다른 클래스가 사용을 하는데, 보통은 상속을 받아서 사용하지만, mixin 클래스는 굳이, mixins 클래스 안에 있는 매서드를 다른 클래스가 사용한다해도, mixin 클래스가 다른 클래스의 부모 클래스가 될 필요는 없습니다.


어떻게 mixin 클래스를 사용해서 뷰를 작성할수 있는지 둘러봅시다. snippets/views.py 파일을 다시 봅니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework import mixins
from rest_framework import generics


class SnippetList(mixins.ListModelMixin, mixins.CreateModeMixin,generics.GenericAPIView):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer

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

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

잠시 어떤일이 일어났는지 확인해 보고 갑니다.


우리는 GenericAPIView 그리고, ListModelMixinCreateModelMixin 을 추가하여 우리의 뷰를 재구성 해보았습니다 (이 세가지는 모두, SnippetList 클래스가 상속 받습니다)


기본 클래스는 코어 기능을 제공하고, mixin 클래스들은, list()create() 액션들을 제공합니다.


따라서 우리는, 명시적으로 getpost 메서드들을 적절한 액션들에 묶어둘수 있습니다.


getlist()에, postcreate() 에 묶어 두는것을 확인 할수 있습니다. 현재까지는 충분히 간단합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class SnippetDetail(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer

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

def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)

def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)

꽤나 비슷합니다. 다시한번, 우리는 GenericAPIView 클래스를 사용하여, 코어 기능을 제공하고, 거기에 mixin 들을 추가하여, .retrieve(), .update() 그리고 .destroy() 기능 액션들을 제공합니다.