티스토리 뷰

파이썬/장고

[drf][viewset] @action

글을 쓰는 개발자 2021. 8. 4. 17:17
반응형

@action decorators

drf의 modelviewset을 쓰면서 해당 기본 기능 말고도 더 많은 기능들을 넣고 싶을 때 쓰면 유용한 데코레이터이다 .

 

하나의 예제를 보여주겠습니다. (아주 간단한 예시 입니다 . ㅎㅎ)

 

 

models.py

from django.db import models


class Memo(models.Model):
    content = models.TextField()
    title = models.CharField(max_length=20)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    objects = models.Manager()

    def __str__(self) -> str:
        return self.title

 

 

 

serializers.py

from rest_framework.serializers import ModelSerializer
from .models import Memo


class MemoSerializer(ModelSerializer):
    class Meta:
        model = Memo
        fields = ['title', 'content']

 

 

views.py

from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from rest_framework.decorators import action
from .models import Memo
from .serializers import MemoSerializer


class MemoModelViewSet(ModelViewSet):
    queryset = Memo.objects.all()
    serializer_class = MemoSerializer

    @action(detail=False, methods=['GET'])
    def recent_memo(self, request):
        recent_memo = Memo.objects.all().order_by('-updated_at')
        serializer = self.get_serializer(recent_memo, many=True)
        return Response(serializer.data)

 

쓰는 방법은 원하는 함수 위에 어노테이션으로 @action을 적어주시고 해당 함수가 detail인지 여부를 확인하시고, methods는 get인지 post인지 또는 delete 등 crud 중 하나 이상의 메소드를 적어주시면 됩니다. 

그리고 해당 기능에 맞게 구현하시면 됩니다.

 

 

urls.py

from django.urls import path
from .views import MemoModelViewSet
memo_list = MemoModelViewSet.as_view({"get": "list", "post": "create"})
memo_detail = MemoModelViewSet.as_view(
    {"get": "retrieve", "patch": "partial_update", "delete": "destroy"})


urlpatterns = [
    path("memo", memo_list),
    path("memo/<int:pk>", memo_detail),
    path("memo/recent", MemoModelViewSet.as_view({"get": "recent_memo"}))
]

 

urls에 표시 할 때에는 as_view() 메소드를 이용하여 해당 메소드가 get,post 등 표시해주고 값으로는 해당 함수의 이름을 적어주시면 됩니다 .

 

action  안에는 serializer 뿐만 아니라 permission에 관한 값도 설정할 수 있습니다 .

 

 

참고: https://www.django-rest-framework.org/api-guide/viewsets/#marking-extra-actions-for-routing

 

Viewsets - Django REST framework

viewsets.py After routing has determined which controller to use for a request, your controller is responsible for making sense of the request and producing the appropriate output. — Ruby on Rails Documentation Django REST framework allows you to combine

www.django-rest-framework.org

 

 

 

****추가 내용***

위의 참고 문서를 보면서 get_object() 무엇인지 궁금해서 찾아 보았다. 

 

get_object()

  • queryset과 pk값을 인자로 받아서 필터링하여 객체로 리턴해주는 메소드

참고:https://velog.io/@jcinsh/RetrieveUpdateDestroyView-%EC%9D%B4%ED%95%B4

 

DRF 코드 이해

아래 코드가 왜 작동하는지 이해할려면, get_object 메소드가 어떻게 작동하는지 알아야 함.

velog.io

 

 

위의 내용을 적은 내용 깃 헙 주소: https://github.com/VIXXPARK/django-remind/tree/main/django-action

 

GitHub - VIXXPARK/django-remind

Contribute to VIXXPARK/django-remind development by creating an account on GitHub.

github.com

 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함