본문 바로가기
기록/TIL

[TIL] 231101 - 데브코스 17일차

by 투말치 2023. 11. 1.

목차

    반응형

    학습 내용

    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