2025/11/20 Django - 13

김기훈·2025년 11월 20일

TIL

목록 보기
61/191

오늘 학습 내용 ✅

시작 전

  • Django - 12에서 했던 연습요 viewset 분리해놓기

    • urls 디렉토리를 파이썬 패키지로 사용하지는 X
  • blog/urls/api_urls.py 생성 | blog/views/api_views.py 생성


APIView

APIVIew

  • Django의 기본 View를 확장하여 RESTful API를 쉽게 구축할 수 있도록 해주는 클래스
  • Django의 View와 유사하지만, APIView는 다양한
    • HTTP 메서드(GET, POST, PUT, DELETE 등)를 명확하게 처리할 수 있는 구조를 제공

주요 특징

  • Request 객체
    • Django의 HttpRequest를 확장한 Request 객체를 사용하여, 파싱된 데이터에 쉽게 접근
  • Response 객체
    • Django의 HttpResponse를 확장한 Response 객체를 사용하여, API 응답을 반환
  • Status 코드
    • rest_framework.status 모듈을 사용해 HTTP 상태 코드를 명확하게 반환 가능
  • Permissions, Throttling
    • APIView 클래스에 권한, 스로틀링 등의 기능을 쉽게 통합 가능

APIView의 장점

  • 세밀한 제어: 각 HTTP 메서드에 대한 동작을 세밀하게 제어 가능
  • 명확한 구조: RESTful API의 각 엔드포인트에 대해 명확한 코드 구조를 유지 가능

APIView 사용법

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

class MyAPIView(APIView):
    def get(self, request):
        data = {"message": "Hello, World!"}
        return Response(data, status=status.HTTP_200_OK)

    def post(self, request):
        data = request.data
        return Response(data, status=status.HTTP_201_CREATED)

실습 🔥

1 블로그 목록 API

  • 페이지네이션 설정

2 블로그 상세페이지 API

  • 상세페이지 만들기
    • FBV버전 상세페이지 만들기

3 블로그 생성 API

  • commit=False 대신 serializer.save(author=request.user)
  • 로그인 처리 permission_classes = [IsAuthenticatedOrReadOnly]
  • 'rest_framework.authentication.BasicAuthentication'
    • 포스트맨에서 사용하기 위해서 사용?

3 문제 발생

  • 문제: author = UserSerializer(many=True, read_only=True)
    • blog/models.py
      • author = models.ForeignKey(User, on_delete=models.CASCADE)
      • ForeignKey → 단일 객체(one)
      • 그런데 Serializer에서는 many=True → 리스트 형태로 처리
        • many=True 빼야함

4 블로그 수정/삭제 API

  • 수정 : PUT / PATCH
    • PUT : 전체 컬럼
    • PATCH : 일부 컬럼(전체 컬럼도 가능)


Generic View

Generic View

  • DRF 에서 제공하는 기본적인 CRUD(Create, Retrieve, Update, Delete)
    • 작업을 수행하는 뷰를 손쉽게 만들 수 있도록 도와주는 클래스
      • 이들은 APIView를 상속받아 특정 작업을 자동으로 처리해주는 뷰 클래스를 제공

제너릭 뷰의 장점

  • 간편함
    • CRUD 작업을 수행하는 뷰를 간단하게 생성 가능
  • 일관성
    • 코드를 간결하고 일관성 있게 유지 가능
  • 재사용성
    • 공통 기능을 손쉽게 재사용 가능

Generic View와 ViewSets의 차이

  • 제너릭 뷰: 개별 동작에 대해 각각의 뷰 클래스를 생성
    • 각 동작을 명확하게 분리할 수 있으며, 필요한 동작만 선택적으로 구현 가능
  • ViewSets: 단일 클래스에서 여러 동작을 처리하며, 라우터와 함께 사용됨
    • 더 간결하게 CRUD API를 구성 가능

Generic View의 종류와 사용법

ListAPIView

  • 데이터베이스의 객체 리스트를 조회하는 API를 생성합니다.
from rest_framework.generics import ListAPIView
from .models import MyModel
from .serializers import MyModelSerializer

class MyModelListView(ListAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

CreateAPIView

  • 새로운 객체를 생성하는 API를 생성합니다.
from rest_framework.generics import CreateAPIView
from .models import MyModel
from .serializers import MyModelSerializer

class MyModelCreateView(CreateAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

ListCreateAPIView

  • 객체 리스트 조회와 객체 생성을 동시에 처리하는 API를 생성
from rest_framework.generics import ListCreateAPIView
from .models import MyModel
from .serializers import MyModelSerializer

class MyModelListCreateView(ListCreateAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer
        

UpdateAPIView

  • 기존 객체를 업데이트하는 API를 생성
from rest_framework.generics import UpdateAPIView
from .models import MyModel
from .serializers import MyModelSerializer

class MyModelUpdateView(UpdateAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

DestroyAPIView

  • 특정 객체를 삭제하는 API를 생성
from rest_framework.generics import DestroyAPIView
from .models import MyModel

class MyModelDeleteView(DestroyAPIView):
    queryset = MyModel.objects.all()

RetrieveAPIView

  • 특정 객체의 상세 정보를 조회하는 API를 생성
from rest_framework.generics import RetrieveAPIView
from .models import MyModel
from .serializers import MyModelSerializer

class MyModelDetailView(RetrieveAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

RetrieveUpdateAPIView

  • 특정 객체의 조회 및 수정을 처리하는 API를 생성
from rest_framework.generics import RetrieveUpdateAPIView
from .models import MyModel
from .serializers import MyModelSerializer

class MyModelDetailUpdateView(RetrieveUpdateAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

RetrieveDestroyAPIView

  • 특정 객체의 조회 및 삭제를 처리하는 API를 생성
from rest_framework.generics import RetrieveDestroyAPIView
from .models import MyModel

class MyModelDetailDeleteView(RetrieveDestroyAPIView):
    queryset = MyModel.objects.all()

RetrieveUpdateDestroyAPIView

  • 특정 객체의 조회, 수정, 삭제를 모두 처리하는 API를 생성
from rest_framework.generics import RetrieveUpdateDestroyAPIView
from .models import MyModel
from .serializers import MyModelSerializer

class MyModelDetailView(RetrieveUpdateDestroyAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

Generic 실습

1 블로그 목록 상세 API

  • model 지워도 됨 / Q(published_at__gte=timezone.now())= datetime 오류 제거

  • 동일한 기능을 하는 코드 단순화

2 블로그 생성 수정 삭제 API

  • 글의 작성자와 수정/삭제/생성 하는 유저가 동일 할 때 이 기능을 이용가능 한게 함

3 댓글 목록 생성 API

  • 댓글 수 세기 / 작성자 이름

4 댓글 수정 삭제 API

  • Retrieve 는 댓글 수정 삭제에 필요 X


새롭게 알게된 내용 ✅

  • shift + F6 = 이름 바꾸는데 그 이름을 되어있는 거 다 변경됨

어려운 내용(추가 학습 필요) ✅

오늘 발생한 문제(발생 했다면) ✅


라이브세션

profile
안녕하세요.

0개의 댓글