재사용될 수 있는 메소드들을 포함하는 클래스
다른 클래스에 기능을 추가하기 위해 다중 상속의 일부로 사용
예시: ListView
와 LoginRequiredMixin
을 결합하면 로그인한 사용자만 리스트를 보는 뷰
# models.py
from django.views.generic import ListView
from django.contrib.auth.mixins import LoginRequiredMixin
class SecureListView(LoginRequiredMixin, ListView):
...생략...
유지보수성 및 확장성 향상 가능
from django.contrib.auth.mixins
LoginRequiredMixin
: 로그인한 사용자만 뷰에 접근 가능PermissionRequiredMixin
: 권한이 있는 사용자만 뷰에 접근 가능from django.views.generic.list
MultipleObjectMixin
: 여러 객체를 다루는 뷰에 공통적인 기능을 제공from django.views.generic.detail
SingleObjectMixin
: 단일 객체를 처리하는 뷰에 사용from django.views.generic.edit
FormMixin
: 폼 처리에 필요한 메소드와 속성을 제공ModelFormMixin
: FormMixin
에 모델 기반 폼 처리 추가DRF의 기본 뷰 클래스, HTTP 메소드에 대한 명시적인 메소드 제공
get(READ), post(CREATE), put(UPDATE), delete(DELETE)
GenericAPIView
와 함께 사용, RESTful API를 위한 CRUD 쉽게 구현
generic.GenericAPIView
는 MRO 상속 원칙에 따라 항상 뒤에 위치
generic.GenericAPIView
- queryset을 통해 뷰가 처리할 데이터 정의 가능
- serializer class 설정 가능
- permission class 설정 가능 - API 접근에 대한 인증과 권한 관리
- pagination 지원
- 뷰 로직 모듈화
mixins.ListModelMixin
- list 메소드를 통해 모델 인스턴스의 컬렉션 조회, get 요청 처리에 사용
- serializer 사용
- pagination 지원
- 필터링, 정렬, 검색 queryset에 대한 필터링, 정렬, 검색 가능
mixins.CreateModelMixin
- create 메소드는 post 요청을 받아 요청에 포함된 데이트를 사용하여 모델 인스턴스 생성
- serializer 사용
mixins.RetrieveModelMixin
- retrieve 메소드는 get 요청을 받아 url에 지정된 식별자를 기반으로 특정 모델 인스턴스를 조회
- serializer 사용
APIView에 ORM 기능을 추가한 클래스, queryset 과 serializer_class 속성을 사용하여 객체를 직렬화하고 쿼리하는데 사용
비슷한 종류의 여러 뷰를 한 곳에 그룹화 가능
ViewSet
내의 액션으로 매핑, HTTP GET 요청은 list()
액션에, HTTP POST 요청은 create()
액션에 매핑Router
클래스를 사용하여 viewset
에 연결된 액션들을 자동으로 URL에 연결GenericAPIView
와 믹스인을 상속받아 사용할 수 있으므로, 필요한 기능을 선택적으로 조합@action
데코레이터를 사용하여 커스텀 액션을 쉽게 추가할 수 있습니다. 이는 표준 CRUD 이외의 동작을 수행route = router.SimpleRouter()
router.register('books', BookViewSet)
# 여기서 books 위치에 작성한 부분이 url에 표시되는 부분이다.
# localhost:8000/books/ <- 요런식으로 구성이 되겠다.
urlpatterns = router.urls
models.Model를 이용하면 파이썬의 클래스 선언과 동시에 데이터베이스 테이블 생성
abstract
: True → 추상클래스로 DB 마이그레이션 시 제외managed
: False → Django에서 관리하지 않는 모델 / django로 개발하기 전부터 있었던 데이터 테이블 사용 시 / 캐시, 로그 등 일시적인 데이터proxy
: True → 이미 존재하는 DB를 다른 방식으로 표현ordering
: 기본 정렬 순서 지정함. 예시: ordering = ['-created_at']
는 모델의 created_at
필드를 기준으로 내림차순 정렬unique_together
: 여러 필드를 조합하여 유일성을 보장함. 예시: unique_together = ('이름', '주민번호')
로 작성되었을 경우 동일한 이름을 가진 사람은 동일한 주민번호로 중복될 수 없음을 의미함.1:N 관계 매핑 : ForeignKey
1:1 관계 매핑 : OneToOneField
N:M 관계 매핑 : ManyToMany
N:M 관계에서는 through
를 사용 <- 중계 테이블
django에서는 중계 테이블을 자동 생성하긴 하지만 아래와 같은 이유로 through를 사용하는 걸 추천한다..
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)