728x90
반응형
Class-based Views
Class-based Views란?
- APIView 클래스를 사용해 구현한 뷰
- 문법이 훨씬 간단하고 명료 해짐
- mixin을 사용하면 crud 함수까지 자동으로 상속받아 구현하지 않아도 됨
Class-based Views 작성
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from django.http import Http404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
class SnippetList(APIView):
"""
List all snippets, or create a new snippet.
"""
def get(self, request, format=None):
snippets = Snippet.objects.all()
serializer = SnippetSerializer(snippets, many=True)
return Response(serializer.data)
def post(self, request, format=None):
serializer = SnippetSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class SnippetDetail(APIView):
"""
Retrieve, update or delete a snippet instance.
"""
def get_object(self, pk):
try:
return Snippet.objects.get(pk=pk)
except Snippet.DoesNotExist:
raise Http404
def get(self, request, pk, format=None):
snippet = self.get_object(pk)
serializer = SnippetSerializer(snippet)
return Response(serializer.data)
def put(self, request, pk, format=None):
snippet = self.get_object(pk)
serializer = SnippetSerializer(snippet, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk, format=None):
snippet = self.get_object(pk)
snippet.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
URLs 작성
urls.py에 작성
from django.urls import path
from rest_framework.urlpatterns import format_suffix_patterns
from snippets import views
urlpatterns = [
path('snippets/', views.SnippetList.as_view()),
path('snippets/<int:pk>/', views.SnippetDetail.as_view()),
]
urlpatterns = format_suffix_patterns(urlpatterns)
Mixin
Mixin 이란?
- 쉽게 재사용성을 구성할 수 있게 해줌
- views.py에 작성
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.CreateModelMixin,
generics.GenericAPIView):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
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와 함께 믹스인을 사용한 코드
- .retrieve(), .update(), destory() 와 같이 간결한 액션을 사용할 수 있음
Generic class-based views
- views.py에 작성
- 함수 선언 마저 하지 않아도 됨
- ListAPIView와 같이 각각의 APIViews를 모두 지원
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework import generics
class SnippetList(generics.ListCreateAPIView):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
이렇게 보니 JPA와 굉장히 유사하다는 느낌을 받는다. 마지막엔 CRUD 함수마저 구현하지 않는데 이렇게 하면 CQRS 구조에서 쿼리를 만들기 매우 편해 보인다. BFF를 구성할 때 장고를 쓰면 매우 편하게 구현할 수 있을 것 같다.
728x90
반응형
'Backend > Django' 카테고리의 다른 글
Django Tutorial 5: Relationships & Hyperlinked APIs (0) | 2024.03.12 |
---|---|
Django Tutorial 4: Authentication & Permissions (0) | 2024.03.10 |
Django Tutorial 2: Requests and Responses (0) | 2024.03.10 |
Django Tutorial 1: Serialization (0) | 2024.03.10 |
DjangoRestFramework 프로젝트 세팅 (0) | 2024.03.09 |