Django REST framework 복습 - 1

오정배·2023년 12월 3일
0

django

목록 보기
1/2

1. Mixin

  • 재사용될 수 있는 메소드들을 포함하는 클래스

  • 다른 클래스에 기능을 추가하기 위해 다중 상속의 일부로 사용

    1.1 CBV + Mixin

    • 예시: ListViewLoginRequiredMixin을 결합하면 로그인한 사용자만 리스트를 보는 뷰

      # models.py
      from django.views.generic import ListView
      from django.contrib.auth.mixins import LoginRequiredMixin
      
      class SecureListView(LoginRequiredMixin, ListView):
      	...생략...
    • 유지보수성 및 확장성 향상 가능

    1.2 Django ~ Mixin

    • CRUD 구현은 GenericView를 사용 또는 직접 구현 필요
      1. from django.contrib.auth.mixins
        • LoginRequiredMixin : 로그인한 사용자만 뷰에 접근 가능
        • PermissionRequiredMixin : 권한이 있는 사용자만 뷰에 접근 가능

      2. from django.views.generic.list
        • MultipleObjectMixin : 여러 객체를 다루는 뷰에 공통적인 기능을 제공

      3. from django.views.generic.detail
        • SingleObjectMixin : 단일 객체를 처리하는 뷰에 사용

      4. from django.views.generic.edit
        • FormMixin : 폼 처리에 필요한 메소드와 속성을 제공
        • ModelFormMixin : FormMixin에 모델 기반 폼 처리 추가

    1.3 DRF ~ CBV

    APIView

    • DRF의 기본 뷰 클래스, HTTP 메소드에 대한 명시적인 메소드 제공
      get(READ), post(CREATE), put(UPDATE), delete(DELETE)

      1.3.1 APIView

      • Django REST Framework (DRF)에서 RESTful 인터페이스를 만들기 위한 기본 블록
      • serializer를 똑같이 선언하는 등 중복되는 부분이 많음

      1.3.2 Mixin

      • 반복 작업을 쉽게 재사용
      • GenericAPIView와 함께 사용, RESTful API를 위한 CRUD 쉽게 구현

        generic.GenericAPIView는 MRO 상속 원칙에 따라 항상 뒤에 위치

      • generic.GenericAPIView
        1. queryset을 통해 뷰가 처리할 데이터 정의 가능
        2. serializer class 설정 가능
        3. permission class 설정 가능 - API 접근에 대한 인증과 권한 관리
        4. pagination 지원
        5. 뷰 로직 모듈화
      • mixins.ListModelMixin
        1. list 메소드를 통해 모델 인스턴스의 컬렉션 조회, get 요청 처리에 사용
        2. serializer 사용
        3. pagination 지원
        4. 필터링, 정렬, 검색 queryset에 대한 필터링, 정렬, 검색 가능
      • mixins.CreateModelMixin
        1. create 메소드는 post 요청을 받아 요청에 포함된 데이트를 사용하여 모델 인스턴스 생성
        2. serializer 사용
      • mixins.RetrieveModelMixin
        1. retrieve 메소드는 get 요청을 받아 url에 지정된 식별자를 기반으로 특정 모델 인스턴스를 조회
        2. serializer 사용

    GenericAPIView

    • APIView에 ORM 기능을 추가한 클래스, queryset 과 serializer_class 속성을 사용하여 객체를 직렬화하고 쿼리하는데 사용

      1.3.3 Generic

      • 모델 기반의 API 뷰를 빠르고 쉽게 작성

      1.3.4 특징

      • ORM 통합 : queryset과 serializer 클래스를 자동으로 사용하여 객체를 검색하고 직렬화
      • Filter 백엔드 지원: 필터링, 정렬, 페이징, API의 기능을 쉽게 확장 가능
      • Mixin 클래스와의 결합
      • 커스터마이징 용이

      1.3.5 종류

      1. ListAPIView: 전체목록
      2. CreateAPIView: 생성
      3. RetrieveAPIView: 1개 보여주기
      4. UpdateAPIView: 1개 업데이트
      5. DestroyAPIView: 1개 삭제
      6. ListCreateAPIView: 전체목록, 생성
      7. RetrieveUpdateAPIView: 1개 보여주기, 수정
      8. RetrieveDestroyAPIView: 1개 보여주기, 삭제
      9. RetrieveUpdateDestroyAPIView: 1개 보여주기, 수정, 삭제

    ViewSet

    • 비슷한 종류의 여러 뷰를 한 곳에 그룹화 가능

      1.3.6 viewset

      • 모델에 대한 기능들을 그룹화하여 작성

      1.3.7 특징

      • 리소스 중심: 특정 리소스(모델)에 대한 연산들을 한 곳에서 처리
      • 액션 매핑: HTTP 메소드들은 ViewSet 내의 액션으로 매핑, HTTP GET 요청은 list() 액션에, HTTP POST 요청은 create() 액션에 매핑
      • Router 사용: URL을 직접 지정하지 않습니다. 대신, DRF의 Router 클래스를 사용하여 viewset에 연결된 액션들을 자동으로 URL에 연결
      • 확장성: GenericAPIView와 믹스인을 상속받아 사용할 수 있으므로, 필요한 기능을 선택적으로 조합
      • 커스터마이징: @action 데코레이터를 사용하여 커스텀 액션을 쉽게 추가할 수 있습니다. 이는 표준 CRUD 이외의 동작을 수행

      1.3.8 Router

      • Viewset에 연결된 액션들을 자동으로 연결
      route = router.SimpleRouter()
      router.register('books', BookViewSet) 
      # 여기서 books 위치에 작성한 부분이 url에 표시되는 부분이다.
      
      # localhost:8000/books/ <- 요런식으로 구성이 되겠다.
      
      urlpatterns = router.urls

2. Django ~ Model

  • models.Model를 이용하면 파이썬의 클래스 선언과 동시에 데이터베이스 테이블 생성

    2.1 Django ~ DB table

    • 모델 클래스 정의 → 모델 클래스 정의 후 필드 선언 → 필드: DB의 스키마 표현 각 열을 정의하게 된다.
    • makemigrations 실행 → 마이그레이션 파일을 생성
    • migrate → 마이그레이션 파일을 읽고 데이터베이스에 해당 마이그레이션을 적용

    2.2 Model 옵션

    • abstract : True → 추상클래스로 DB 마이그레이션 시 제외
    • managed : False → Django에서 관리하지 않는 모델 / django로 개발하기 전부터 있었던 데이터 테이블 사용 시 / 캐시, 로그 등 일시적인 데이터
    • proxy : True → 이미 존재하는 DB를 다른 방식으로 표현
    • ordering : 기본 정렬 순서 지정함. 예시: ordering = ['-created_at']는 모델의 created_at 필드를 기준으로 내림차순 정렬
    • unique_together: 여러 필드를 조합하여 유일성을 보장함. 예시: unique_together = ('이름', '주민번호') 로 작성되었을 경우 동일한 이름을 가진 사람은 동일한 주민번호로 중복될 수 없음을 의미함.

    2.3 모델 간 매핑 필드

    • 1:N 관계 매핑 : ForeignKey

    • 1:1 관계 매핑 : OneToOneField

    • N:M 관계 매핑 : ManyToMany

    • N:M 관계에서는 through 를 사용 <- 중계 테이블

      • django에서는 중계 테이블을 자동 생성하긴 하지만 아래와 같은 이유로 through를 사용하는 걸 추천한다..

        1. 직관적인 테이블명
        2. 확장 가능성
        from django.db import models
        
        class Person(models.Model):
            name = models.CharField(max_length=128)
        
        class Group(models.Model):
             name = models.CharField(max_length=128)
             members = models.ManyToManyField(Person, through='Membership')
        
        class Membership(models.Model):
        # 중계 테이블
            person = models.ForeignKey(Person, on_delete=models.CASCADE)
            group = models.ForeignKey(Group, on_delete=models.CASCADE)
            date_joined = models.DateField()
            invite_reason = models.CharField(max_length=64)
profile
개발 관련 블로그 입문

0개의 댓글

관련 채용 정보