[Django Rest Framework] #3

현지수·2022년 8월 28일
0

유튜브 참고영상

✨ Django Rest API 업데이트(PUT)

  • student/api.py
class StudentDetail(APIView):
    def get(self, request, student_id):
        model = Student.objects.get(student_id=student_id)
        serializer = StudentSerializer(model)
        return Response(serializer.data)
  • rest_youtube_test/urls.py에 경로 지정
path('api/student_list/<int:student_id>', StudentDetail.as_view(),name='student_list'),
  • 업데이트도 가능하게 api.py 수정
def put(self, request, student_id):

        model = Student.objects.get(student_id = student_id)

        serializer = StudentSerializer(model, 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)

post랑 비슷하지만 student_id로 해당되는 값만 뽑아져 나와서 수정이 가능하다
이 상태로 서버 들어가서 수정해보면 다른 필드도 필요하다고 뜨는데 아래와 같이 serializers.py를 수정하면 된다!

  • student/serializers.py 수정
from rest_framework import serializers
from .models import Student

class StudentSerializer(serializers.ModelSerializer):

    student_id = serializers.CharField(required=False)
    name = serializers.CharField(required=False)
    age = serializers.CharField(required=False)

    class Meta:

        model = Student
        fields = '__all__'

✨ Django Rest API DELETE(삭제)

  • student/api.py
def delete(self, request, student_id):
        model = Student.objects.get(student_id=student_id)
        model.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

아래는 강의외에 추가로 학습한 내용이다.

✨ format suffix

공식문서와 유튜브를 참고하면서 공부하다가 format suffix라는 걸 알게되었다. 전 게시글에서 resopnse가 하나의 컨텐츠 유형에 고정되지 않는다고 했는데 그럴 때 URL endpoint에 형식을 참조할 때 쉽게 할 수 있도록 하는 것으로 이해했다.

Format suffixes
웹 API의 일반적인 패턴은 URL에서 파일 이름 확장자를 사용하여 특정 미디어 유형에 대한 endpoint를 제공하는 것이다.
예를 들어, ‘http://example.com/api/users.json’은 JSON 표현을 제공한다.
API의 URLconf에 있는 각 개별 항목에 형식 접미사 패턴을 추가하는 것은 오류가 발생하기 쉽다. 추가 URL 패턴을 반드시 추가 할 필요는 없지만, 특정 형식을 참조하는 간단하고 깔끔한 방법을 제공하는 것이다.

format_suffix_patterns
urlpatterns = format_suffix_patterns(urlpatterns, suffix_required=False, allowed=None)

arguments

  • urlpatterns : 필수이며 URL 패턴 목록
  • suffix_required : 선택사항이며 URL의 접미사를 옵션으로 하는지, 필수로 하는지를 나타내는 boolean이다. Default 값은 False이다.
  • allowed : 선택사항이며 유효한 형식 접미사의 list 또는 tuple이다. 제공되지 않으면 와일드 카드 형식 접미사 패턴이 사용된다.

그런데 format_suffix_patterns를 사용하는 경우, 'format'키워드를 view에 추가해야한다.

def snippet_list(request, format=None):

class-bassed view는 다음과 같이 추가한다.

class CommentList(APIView):
    def get(self, request, format=None):

사용 된 kwarg의 이름은 FORMAT_SUFFIX_KWARG설정을 사용하여 수정할 수있다. format_suffix_patterns는 includeURL 패턴으로 내림차순을 지원하지 않는다.

✨ GenericAPIView

유튜브는 CBV로 작성되었다. DRF 공식문서는 처음에 FBV로 시작하는데, CBV로 리팩토링 하는 과정이 있는데 거기서 GenericAPIView를 사용하는 것이 나오면서 알게된 개념이다. 공식문서를 따라가다 이해가 안가서 아래 블로그 글을 보니까 매우 자세히 정리되어있다.

참고 블로그_1
참고 블로그_2

  • Django Rest Framework에서는 GenericAPIView에 List, Create 등 다양한 Mixin 클래스를 결합해 APIView를 구현할 수 있다.
  • GenericAPIView는 CRUD(생성/읽기/수정/삭제)에서 공통적으로 사용되는 속성을 제공하고, Mixin은 CRUD 중 특정 기능을 수행하는 메소드를 제공한다.
  • GenericAPIView와 Mixins으로 정확한 기능 구현이 어려울 때, Override해서 customizing할 수 있음

근데 아직 GeneicAPIView를 사용해 구현을 해보지 않아서 감이 안온다....... (추후 정리하도록 하겠다.)

<구현하기 전 정리할 것>

  • CBV가 어떤 방식으로 구현되는지 다시 정리해보기
  • Mixin 클래스(인프런 강의 들으면서 공부했었는데 까먹었당,,ㅎ)
profile
두두

0개의 댓글