본문 바로가기
Django/Django REST framework

4-2 Generic Views (Mixin,Concrete)

by hyun-am 2021. 6. 23.

Mixins

mixin 클래스는 기본 view 동작을 제공하는 데 사용되는 작업을 제공합니다. 클래스의 Mixin은 .get() 및 .post()와 같은 핸들러 메서드를 직접 정의하는 대신 action 메서드를 제공합니다. 이것은 행동을 보다 유연하게 구성할 수 있게 해줍니다.

minxin클래스는 rest_framework.mixins에서 import할 수 있습니다.

ListModelMixin

쿼리셋을 list로 구현해주는 .list(request, *args, **kwargs)메서드를 제공합니다.

쿼리셋이 채워지면 쿼리셋의 serializer된 표현을 body의 response로 200 OK response를 반환합니다. response 데이터는 선택적으로 페이징될 수 있습니다.

CreateModelMixin

.create(request, *args, **kwargs) 메서드를 제공해줍니다. 이것은 새로운 모델 인스턴스를 생성하거나 저장할 때 사용됩니다.

개체가 생성되면 201 Created response를 반환하고, object의 serializer된 표현을 body response로 반환합니다. 표현에 url이라는 키가 포함되어 있으면 response의 Location 헤더가 해당 값으로 채워집니다.

개체를 만드는 데 제공된 request 데이터가 올바르지 않으면 error details가 response의 body에 400 Bad Request를 반환합니다.

RetrieveModelMixin

.retrieve(request, *args, **kwargs)메서드를 제공합니다. 이것은 기존 모델 인스턴스를 response에 반환하는 것을 구현합니다.

개체를 검색할 수 있는 경우 개체의 serializer된 표현을 response의 body에 200 OK response를 반환합니다. 그렇지 않으면 404 Not Found가 반환됩니다.

UpdateModelMixin

.update(request, *args, **kwargs)메서드를 제공합니다. 이것은 이미 존재한 데이터를 업데이트하고 저장합니다.

또한 .partial_update(request, *args, **kwargs)메서드를 제공합니다. 이것은 update의 모든 필드가 선택적 이라는 점을 제외하고는 update와 비슷합니다.

object가 업데이트되면 개체의 직렬화된 표현을 response body로 하여 200 OK response를 반환합니다.

개체를 업데이트하기 위해 제공된 request data가 올바르지 않으면 detail error가 response body로 지정된 400 Bad Request로 반환됩니다.

DestroyModelMixin

.destroy(request, *args, **kwargs)메서드를 제공합니다. 이것은 존재하는 인스턴스를 삭제합니다.

만약 오브젝트가 삭제되면 204 No Content를 response합니다. 만약 다르면 404 Not Found를 호출합니다.

Concrete View Classes

다음은 Concrete(구체적인) generic view입니다. generic view를 사용하는 경우 크게 사용자 커스터마이징된 동작이 필요하지 않는 한 일반적으로 이 수준에서 작업할 수 있습니다.

view클래스는 rest_framework.generics에서 가져올 수 있습니다.

CreateAPIView

오직 Create endpoint만 사용할 수 있습니다.

post method 핸들러를 제공합니다.

Extends: GenericAPIView, CreateModelMixin

예시 : 도서관 서비스를 이용할 유저를 만들때 사용하는 API를 구현하고 싶을때 사용

ListAPIView

모델 인스턴스 collection을 읽기 전용 endpoints로 사용합니다.

get method 핸들러를 제공합니다.

Extends: GenericAPIView, ListModelMixin

예시 : 도서관 서비스를 이용하고 있는 모든 유저 리스트를 Get하는 API를 구현하고 싶을때 사용

RetrieveAPIView

한 개의 모델 인스턴스를 읽기 전용 Endpoints로 사용합니다.

get method 핸들러를 제공합니다.

Extends: GenericAPIView, RetrieveModelMixin

예시 : 유저 Pk가 1인 유저를 get하는 API를 구현하고 싶을때 사용

DestroyAPIView

한개의 모델 인스턴스를 삭제 하는 endpoints로 사용합니다.

delete method 핸들러를 제공합니다.

Extends: GenericAPIView, DestroyModelMixin

예시 : 유저 Pk가 1인 유저를 delete 하는 API를 구현하고 싶을떄 사용

UpdateAPIView

한개의 모델 인스턴스를 업데이트(수정)는것을 endpoints로 사용합니다.

put과 patch method 핸들러를 제공합니다.

Extends: GenericAPIView, UpdateModelMixin

ListCreateAPIView

모델들을 read-write할 수 있습니다.

get과 post method 핸들러를 제공합니다.

Extends: GenericAPIView, ListModelMixin, CreateModelMixin

RetrieveUpdateAPIView

한개의 모델을 read하거나 update하는 endpoints로 사용합니다

get과 put, patch method 핸들러를 제공합니다.

Extends: GenericAPIView, RetrieveModelMixin, UpdateModelMixin

RetrieveDestroyAPIView

한개의 모델을 read 또는 delete하는 endpoints로 사용합니다.

get과 delete method 핸들러를 제공합니다.

Extends: GenericAPIView, RetrieveModelMixin, DestroyModelMixin

RetrieveUpdateDestroyAPIView

read-write-delete를 위한 endpoints를 제공합니다.

get,put,patch,delete method핸들러를 제공합니다.

Extends: GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin

Customizing the generic views

대개 generic view를 사용하지만 약간 사용자 커스터마이징된 동작을 사용할 수 있습니다. 여러 위치에서 사용자 커스터마이징된 동작의 일부를 재사용하는 경우 동작을 공통 클래스로 리팩터링하고 필요에 따라 view 또는 viewset에 적용할 수 있습니다.

Creating custom mixins

예를 들어 URL conf의 여러 필드를 기반으로 개체를 조회해야 하는 경우 다음과 같은 mixin class를 생성할 수 있습니다.

class MultipleFieldLookupMixin:
    """
    Apply this mixin to any view or viewset to get multiple field filtering
    based on a `lookup_fields` attribute, instead of the default single field filtering.
    """
    def get_object(self):
        queryset = self.get_queryset()             # Get the base queryset
        queryset = self.filter_queryset(queryset)  # Apply any filter backends
        filter = {}
        for field in self.lookup_fields:
            if self.kwargs[field]: # Ignore empty fields.
                filter[field] = self.kwargs[field]
        obj = get_object_or_404(queryset, **filter)  # Lookup the object
        self.check_object_permissions(self.request, obj)
        return obj

그런 다음 사용자 커스텀 동작을 적용해야 할 때마다 view 또는 viewset에 이 조합을 적용하기만 하면 됩니다.

class RetrieveUserView(MultipleFieldLookupMixin, generics.RetrieveAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    lookup_fields = ['account', 'username']

커스터마이징 해야할 동작이 있는 경우 사용자 정의 mixins를 사용하는 것이 좋습니다.

Creating custom base classes

여러가지 view에서 mixin을 사용하는 경우 이단계를 한 단계 더 진행하여 프로젝트 전체에서 사용할 수 있는 고유한 기본 viewset을 생성할 수 있습니다. 예시는 다음과 같습니다.

 

class BaseRetrieveView(MultipleFieldLookupMixin,generics.RetrieveAPIView):
    pass

class BaseRetrieveUpdateDestroyView(MultipleFieldLookupMixin,
                                    generics.RetrieveUpdateDestroyAPIView):
    pass

프로젝트 전체에서 많은 수의 view를 일관되게 반복해야하는 사용자 커스텀 동작이 있는 경우 사용자 커스텀 base class를 사용하는 것이 좋습니다.

 

PUT as create

3.0 이전 버전에서는 개체가 이미 존재하는지 여부에 따라 REST 프레임워크 mixin이 put을 업데이트 또는 생성 작업으로 처리했습니다.

PUT를 create 작업으로 허용하면 개체의 존재 또는 존재 여부에 대한 정보가 노출되기 때문에 문제가 발생합니다. 또한 이전에 삭제된 인스턴스를 투명하게 다시 생성하는 것이 단순히 404 response를 반환하는 것 보다 더 나은 기본 동작이라는 사실도 분명하지 않습니다.

"PUT as 404" 스타일과 "PUT as create" 스타일 모두 다른 상황에서 유효할 수 있지만, 이제 버전 3.0 이후부터는 보다 단순하고 명확해졌기 때문에 404동작을 기본값으로 사용합니다.

만약 이것을 사용하고 싶으면 다음 주소에서 사용하는것을 참고하면 되겠습니다.

링크 : https://gist.github.com/tomchristie/a2ace4577eff2c603b1b

 

PUT-as-create mixin class for Django REST framework.

PUT-as-create mixin class for Django REST framework. - put_as_create.py

gist.github.com

DRF 참고 문서

https://www.django-rest-framework.org/api-guide/generic-views/#creating-custom-base-classes

 

Generic views - Django REST framework

 

www.django-rest-framework.org

 

'Django > Django REST framework' 카테고리의 다른 글

6. Routers  (0) 2021.06.28
5. ViewSets  (0) 2021.06.26
4-1. Generic Views (GenericAPIView)  (2) 2021.06.07
3. DRF-Views  (0) 2021.06.06
2. DRF-Response  (0) 2021.06.05

댓글