인코스런 2기

Day2 - 장고 온보딩 프로젝트 2

B1001101 2022. 6. 9. 23:40

원래 어제 썼어야 하는데 피곤해서 일찍 잠들어버리는 바람에 오늘 쓴다. 오늘은 본격적으로 Django Rest Framework 사용법을 익혔다.

 

학습한 내용

DRF Generic View & Serializer

  • Generic View
    • https://www.django-rest-framework.org/api-guide/generic-views/
    • 빠르게 뷰를 생성할 수 있다.
    • 패키지 추가: from rest_framework import generics
    • Generic View는 기본 클래스인 GenericAPIView와 Mixin의 결합
    • Mixin: Generic View와 함께 상속받아서 필요한 기능 추가
      • ListModelMixin: Read(GET), 여러 개(List View)
      • RetrieveModelMixin: Read(GET), 1개(Detail View)
      • CreateModelMixin: Create(POST)
      • UpdateModelMixin: Update(PUT)
      • DestroyModelMixin: Delete(DELETE)
    • Generic View 종류
      • ListCreateAPIView: Create(POST), Read(GET)
        → GenericAPIView + ListModelMixin + CreateModelMixin
      • RetrieveUpdateDestroyAPIView: Read(GET), Update(PUT), Delete(DELETE)
        → GenericAPIView + RetrieveModelMixin + UpdateModelMixin + DestroyModelMixin
      • 이 외에도 여러가지가 있다
    • 설정
      • queryset
      • serializer_class
  •  Serializer
    • https://www.django-rest-framework.org/api-guide/serializers/ 
    • 뷰와 데이터베이스를 연결하는 역할 (Object ↔︎JSON)
    • Django Form과 비슷
    • 패키지 추가: from rest_framework import serializers
    • Field 종류
      • CharField: 텍스트
        • max_length: 최대 길이
      • IntegerField: 정수
      • ChoiceField: 정해진 값들 중 선택
        • choices: 선택 목록
      • PrimaryKeyRelatedField: Foreign Key
        • 반드시 queryset 또는 read_only 속성 있어야 함
    • 필드에 read_only 속성을 넣어주면 데이터는 볼 수 있지만 입력 폼에는 필드가 안 나온다.
    • ModelSerializer: 모델에 맞는 필드 자동으로 설정
    • 메소드
      • validate(self, attrs): 데이터 검증 
      • create(self, validated_data): 데이터베이스에 새 객체 추가
      • update(self, validated_data): 데이터베이스에 저장된 객체 수정

 

Pagination

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
    'PAGE_SIZE': 100
}
  • 종류
    • PageNumberPagination
      • page_size: 한 페이지에 보여줄 엘리먼트 개수
      • page_query_param: 페이지 번호 받아올 파라미터 이름 (default: page)
      • page_size_query_param: 페이지 사이즈 받아올 파라미터 이름 (default: None)
      • max_page_size: 보여줄 수 있는 최대 페이지
    • LimitOffsetPagination
      • default_limit: page_size와 같은 역할
      • limit_query_param: limit 값 받아올 파라미터 이름 (default: limit)
      • offset_query_param: offset 값 받아올 파라미터 이름 (default: offset)
    • CursorPagination
      • page_size: 한 페이지에 보여줄 엘리먼트 개수
      • cursor_query_param: cursor 값 받아올 파라미터 이름 (default: cursor)

 

Filterset

from django_filters import rest_framework as filters
from app.movie.models import Movie

class MovieFilter(filters.FilterSet):

    class Meta:
        model = Movie
        fields = ['category', 'avg_rating_filter']
  • Generic View에 아래 내용 추가
    • filter_backends = [filters.DjangoFilterBackend]
      filterset_class = 필터셋클래스

 

Permissions

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ]
}
  • 기본적으로 제공되는 Permission 클래스 종류
    • IsAuthenticated: 로그인한 사용자만 허용
    • IsAdminUser: 관리자 계정만 허용
  • Custom Permission
    • 패키지 추가: from rest_framework.permissions import BasePermission 
    • BasePermission 클래스 상속
    • has_permission 메소드 구현
from rest_framework.permissions import BasePermission

class IsStaffUser(BasePermission):

   def has_permission(self, request, view):
       return request.user.is_staff

 

Middleware

 

Settings