원래 어제 썼어야 하는데 피곤해서 일찍 잠들어버리는 바람에 오늘 쓴다. 오늘은 본격적으로 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 - 이 외에도 여러가지가 있다
- ListCreateAPIView: Create(POST), Read(GET)
- 설정
- 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 속성 있어야 함
- CharField: 텍스트
- 필드에 read_only 속성을 넣어주면 데이터는 볼 수 있지만 입력 폼에는 필드가 안 나온다.
- ModelSerializer: 모델에 맞는 필드 자동으로 설정
- 메소드
- validate(self, attrs): 데이터 검증
- create(self, validated_data): 데이터베이스에 새 객체 추가
- update(self, validated_data): 데이터베이스에 저장된 객체 수정
Pagination
- https://www.django-rest-framework.org/api-guide/pagination/
- 적용 방법
- 특정 뷰에 적용: Generic View에 pagination_class 속성 추가
- 전체 뷰에 적용: config의 settings.py에 다음과 같이 추가
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)
- PageNumberPagination
Filterset
- https://django-filter.readthedocs.io/en/stable/guide/rest_framework.html#adding-a-filterset-with-filterset-class
- 패키지 추가: from django_filters import rest_framework as filters
- Filterset 클래스
- class Meta:
- model: 사용할 모델
- fields: 필터 적용할 필드 설정
- class Meta:
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 = 필터셋클래스
- filter_backends = [filters.DjangoFilterBackend]
Permissions
- https://www.django-rest-framework.org/api-guide/permissions/
- 적용 방법
- 특정 뷰에 적용: Generic View에 permission_classes 추가
- 전체 뷰에 적용: config의 settings.py에 다음과 같이 추가
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
'인코스런 2기' 카테고리의 다른 글
커머스 프로젝트 4주차 WIL (0) | 2022.07.10 |
---|---|
커머스 프로젝트 3주차 WIL (0) | 2022.07.03 |
Day4 - 장고 온보딩 프로젝트 4 (0) | 2022.06.10 |
Day3 - 장고 온보딩 프로젝트 3 (0) | 2022.06.09 |
Day 1 - OT & 장고 온보딩 프로젝트 1 (0) | 2022.06.07 |