학습주제
Class 기반의 뷰(Views)
학습내용
지난시간 우리는 CRUD를 각 메소드를 구현. request.method
에 따라 분기점으로 기능을 수행함.
메소드 기반으로 구현하는 방법이었으나, 이번엔 클래스로 구현해보려고 한다.
이를 위한 APIView를 import 해준다.
from rest_framework.views import APIView
APIView를 상속받아 Questionlist를 생성한다. get, post 메소드를 생성하고, 전에 분기점 아래 있던 코드를 그대로 재사용한다.
class Questionlist(APIView):
def get(self, request):
questions = Question.objects.all()
serializer = QuestionSerializer(questions, many = True)
return Response(serializer.data)
def post(self, request):
serializer = QuestionSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
전에 썼던 코드는 지운다. 비교를 하면 if문을 타고 인계를 하는 것보다, 메소드를 타고 확실하게됨. 데코레이터도 미사용.
전에 사용했던 메소드 question_list
를 삭제했기 때문에, 이와 연결된 url도 수정해 주어야 한다.
polls_api urls.py로 이동해
path('question/', QuestionList.as_view(), name='question-list'),
변경해준다. 특이한점은 뒤에 .as_view()
가 붙는다. name은 그대로 놔둔다. 요청이 들어오면 as_view()는 request를 받아서 QuestionList
의 인스턴스를 생성한다. 그 후 request.method
의 값에 따라 메소드 get을 호출할지 post를 호출할지 결정한다. urls.py에서 클래스만 넘겨받아서 내부 메소드 등을 통해 request를 넣은 인스턴스를 생성한다.
잘 생성된다.
question_detail
도 클래스로 바꾸어 본다. 지난번엔 한 메소드에서 여러번 호출되어
question = get_object_or_404(Question, pk=id)
를 상단에 적어 해결했지만, 이번엔 각각의 메소드를 상황에 따라 별도로 호출하기 때문에 각각 생성해준다. 마찬가지고 if 분기점 아래에 있었던 행동들을 그대로 복사해서 붙여준다. 데코레이터가 필요 없는 이유는 클래스의 상속기능으로 구현되기 때문.
처음 구현해볼때는 메소드로 분기를 생성해가면서 만들어보는것도 나쁘지 않은것같다. 흐름을 이해하기 좋다.