목차
학습 내용
Django REST Framework
- Serializer
- ModelSerializer
- HTTP Method : GET, POST, PUT, DELETE
새로 알게 된 것
Serializer
- Serialize : 모델 인스턴스를 JSON 형식의 데이터로 변환하는 과정
기본 Serializer는 모델에 있는 필드들을 정의해야 한다.
이를 간단하게 하기 위해 ModelSerializer를 사용한다.
필드를 하나씩 정의할 필요가 없고, create, update 메소드를 만들지 않아도 된다.
Meta 정보만 입력하면 Serializer를 만들 수 있다.
class QuestionSerializer(serializers.ModelSerializer):
class Meta:
model = Question
fields = ['id', 'question_text', 'pub_date']
GET 메소드 실습을 진행하다가 TemplateDoesNotExist 오류가 발생했다.
settings.py의 INSTALLED_APPS에 rest_framework를 추가해서 해결했다.
Response를 반환할 때 status를 지정해서 반환하기
rest_framework의 status에서 원하는 status를 지정할 수 있다.
from rest_framework import status
[...]
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
Class 기반의 뷰
HTTP 메소드를 구분할 때 분기문을 사용해서 구현했는데, 클래스로 작성해서 더 명확하게 구분할 수 있다.
#urls.py
path('question/', QuestionList.as_view, name='question-list'),
#views.py
from rest_framework.views import APIView
class QuestionList(APIView):
def get(self, request):
questions = Question.objects.all()
serializer = QuestionSerializer(questions, many = True) #여러 개의 인스턴스를 인식하게 함
return Response(serializer.data)
url을 지정할 때 기존에는 메소드 이름을 입력했다면 클래스.as_view를 사용한다.
이렇게 작성한 뷰를 Mixin을 사용하면 더 간단하게 만들 수 있다.
class QuestionList(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
queryset = Question.objects.all()
serializer_class = QuestionSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
- ListModelMixin : GET 요청을 처리
- CreateModelMixin : POST 요청 처리
여기서 generic API view를 사용해서 더 간단하게 만들 수 있다.
class QuestionList(generics.ListCreateAPIView):
queryset = Question.objects.all()
serializer_class = QuestionSerializer
generics 클래스에 get, put, update, delete 메소드들이 구현되어 있기 때문에 구현하지 않아도 된다.
느낀 점
Django Rest framework를 사용해 간단하게 API를 개발할 수 있는 것 같다. 처음에는 함수 뷰를 사용해 하나씩 구현하다가 클래스 뷰를 사용하고 거기에 다른 라이브러리를 사용하니까 코드가 간결해지는 것을 체감할 수 있었다.
'기록 > TIL' 카테고리의 다른 글
[TIL] 231107 - 데브코스 23일차 (5) | 2023.11.07 |
---|---|
[TIL] 231102 - 데브코스 18일차 (0) | 2023.11.02 |
[TIL] 231031 - 데브코스 16일차 (0) | 2023.10.31 |
[TIL] 231030 - 데브코스 15일차 (0) | 2023.10.30 |
[TIL] 231027 - 데브코스 12일차 (0) | 2023.10.27 |