본문 바로가기
source-code/Django

Django REST Framework _ Mixin 사용하기

by mattew4483 2021. 1. 23.
728x90
반응형

함수형에서 클래스형으로 view를 작성하면서 코드가 한결 간결해졌었다.

하지만 여전히 각 HTTP method에 따라 비슷한 내용들을 반복되는 부분이 많았다!

(각 요청마다 serializer에 담는다던지)

 

친절한 DRF는 이러한 중복되는 코드들을 rest_frame.mixins 에 미리 구현해뒀다!

적극 활용해보도록 하자.


1. model, serializer 작성

역시나 똑같다!

 

2. view 작성

views.py

우선 필요한 모듈을 import!

mixins과 generics이 사용될 예정이다.

 

views.py

제일 먼저 PostList!

mixin은 generics.GenericAPIView를 기본으로 다양한 믹스인 클래스를 결합해 사용된다.

즉 GenericAPIView는 CRUD에서 공통적으로 사용되는 속성을 제공하고,

Mixins는 CRUD 중 특정 기능을 수행하는 메서드를 제공하는 것!

 

GenericAPIView 역시 다른 클래스형 뷰와 마찬가지로 오버라이딩을 통해 커스터마이징이 가능하다.

해당 속성들은 다음과 같다!

더보기

1) Basic settings

1. queryset : view에서 객체를 반환하는데 사용. 반드시 지정해줘야 한다!

queryset 속성을 사용하거나, get_queryset() 메서드를 통해 오버라이딩이 가능하다.

 

2. serializer_class : 유효성 검증이나 serialize에 사용될 serializer를 지정하면 된다.

역시 serializer_class 속성을 사용하거나, get_serializer_class() 메서드를 통해 오버라이딩!

 

3. lookup_field : 개별 모델을 조회할 때 사용할 모델 필드!(기본적으로는 pk다) 

커스터마이징을 원할 경우 API views와 serializer 클래스가 lookup 필드를 설정해야 한다.

 

2) Pagination

1. pagination_class : 리스트 결과들을 페이지네이션 할 때 사용된다.

 

3) Filtering

1. filter_backends : queryset을 필터링할 때 사용될 backend 클래스를 지정하는 클래스.

default로 settings의 DEFAULT_FILTER_BACKENDS와 같은 값을 갖고 있다.

기본적으로는 queryset과 serializer_class를 지정하고, 상속받은 Mixin과 연결해주는 형태로 작동된다.

views.py

이런 식으로! 역시나 클래스명이 HTTP method명과 똑같아서 알아보기 쉽다.

즉 GET 요청이 오면 → list를, POST 요청이 오면 create를 수행하는 것!

 

views.py

다음은 PostDetail. 별반 다른 건 없다.

역시나 GET 요청 시 retrieve(세부 정보), PUT요청 시 update, delete요청이 destroy를 수행한다!

 

그런데 희한한 점이 있다. PostDetail은 하나의 Post에 해당하는 기능을 수행하는데...

왜 queryset은 Post.objects.all()로 받아온 걸까?

 

이를 알기 위해서는...

RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin의 소스 코드를 뜯어봐야 한다!

요 녀석들은 각각 retrieve, update, destroy라는 내장 함수를 갖고 있다.

 

그리고 이 내장 함수들은 

instance = self.get_object()

serializer = self.get_serializer(instance)

return Response(serializer.data) 라는 코드를 포함하고 있다!

 

여기서 get_object()는?

queryset과 pk값을 인자로 받아서 queryset.filter(pk=pk)로 queryset을 뽑고,

obj=queryset.get()으로 객체만 뽑아서 리턴해주는 메소드!

즉 위 함수처럼만 적었는데도 return 한 결과는 Post.objects.get(pk=pk)와 같은 결과가 된 것이다.

 

마찬가지로 그 밑의 get_serializer()는?

instance를 인자로 받아서, 해당 객체를 serialize 해주는 메소드 되시겠다.

 

3. urls 작성

똑같은 클래스 형 뷰이기 때문에 달라지는 건 없다.


그런데 놀라운 점. 여기서 끝이 아니다!

view를 조금 더 간략하게 작성할 수 있도록 DRF에서는 mixin을 포함한 Generic View를 제공하고 있다!

 

views.py

...? 맞다. 이게 끝이다!

generics에 만들어져 있는 ListCreateAPIView와 RetrieveUpdateDestroyAPIView를 사용한 것!

이름에서 짐작할 수 있겠지만...

ListCreateAPIView는 GET 요청 시 list를, POST 요청 시 create를.

RetrieveUpdateDestroyAPIView는 GET 요청 시 detail을, PUT 요청 시 update를, DELETE요청 시 destroy를 작동!

 

와우! 그럼 이렇게 모든 기능이 정상적으로 작동함을 볼 수 있다.

HTML form으로 보이기 때문에(내부 설정이겠지?) 훨씬 편하다!

728x90
반응형