Django - 실습편 view (3)

아카이브 · 2021. 6. 8. 16:04

Django에서는 여러방식으로 view를 구성할 수 있다. 대표적으로 크게 나누자면 FBV, CBV로 나눠진다

 

FBV (Function Based View)

api_view 데코레이터를 받아서 구성된다.

@api_view(['GET','POST'])
def answer_view(requests):
	if requests.method == "GET":
    	return get_answer_view(request)
    elif requests.method == "POST":
        return post_answer_view(request)
        
        
def get_answer_view(request):
    question = models.Question.objects.all()
    serializer = serializer.BoxQuestionSerializer(queryset, many=True)
    return Response(
            {
                "success": 1,
                "results": serializer.data,
            },
            status=status.HTTP_200_OK
        )

 

CBV (Class Based View)

클래스 기반뷰도 2가지로 나뉜다.

base viewsGeneric display views

 

base views는 rest_framework.views의 APIView를 상속받아서 진행된다. 

class AnswerAPIView(APIView):

    def get(self, request, *args, **kwargs):
    	answer = models.answer.objects.all()
        serializer = serializer.BoxQuestionSerializer(answer, many=True)

        return Response(
            {
                "success": 1,
                "results": serializer.data,
            },
            status=status.HTTP_200_OK
        )
        

그리고 viewset을 이용하는 방법도 있다. 단 뷰셋을 사용하게될경우엔 url에서 DefaultRouter를 호출해서 url을 등록해줘야 한다.

router = DefaultRouter()

from rest_framework.routers import DefaultRouter
from django.urls import path, include
from . import viewsets

app_name = "box"

router = DefaultRouter()
router.register("", viewsets.AnswerViewsets, basename="box")

urlpatterns = router.urls
class AnswerViewsets(viewsets.ModelViewSet):

    queryset = models.answer.objects.all()
    serializer_class = serializer.BoxQuestionSerializer

Generic display views는 rest_framework의 generics을 상속받아 진행된다.

 

get_queryset = 해당 함수에서 기본 쿼리셋이 진행된다.

permission_class = 각 뷰별로 권한을 지정할 수 있다.

class AnswerListView(generics.ListAPIView):
    serializer_class = serializers.BoxQuestionSerializer
    permission_classes = [permission.UserCheck]

    def get_queryset(self):
        queryset = models.Question.objects.all()
        return queryset

    def list(self, request, *args, **kwargs):

        queryset = self.get_queryset()

        serializer = self.get_serializer(queryset, many=True)

        return Response(
            {
                "success": 1,
                "results": serializer.data,
            },
            status=status.HTTP_200_OK
        )

 

'아카이브' 카테고리의 다른 글

이슈 트래커에 대하여  (0) 2021.07.22
Django - 실습편 JWT (4)  (0) 2021.06.08
Django - 실습편 model (2)  (0) 2021.06.08
Django - 실습편 기본세팅 (1)  (0) 2021.06.08
ruby on rails - 실습 세팅편(1)  (0) 2021.06.03