로딩 중이에요... 🐣
[코담]
웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트
8. 사용자 모델 커스터마이징 | ✅ 저자: 이유정(박사)
managers.py
는 “모델이 갖고 있는 데이터베이스 조회/생성 로직” 을 모아두는 곳
- Django 모델과 매니저(Manager)의 역할 분리
-
models.py
- 스키마 정의: 테이블 필드,
Meta
옵션,__str__
등 - (필요시) 인스턴스 메서드 오버라이드: 예를 들어
save()
를 커스터마이징
- 스키마 정의: 테이블 필드,
-
managers.py
- 매니저(Manager) 클래스 정의:
models.Manager
또는BaseUserManager
를 상속 - 테이블 레벨 로직(factory 메서드, 기본 질의(query) 메서드 등)
- 매니저(Manager) 클래스 정의:
커스텀 매니저 메서드가 실제로 어떻게 동작하고, 왜 필요한지 예시:
create_user()
/ create_superuser()
회원가입과 슈퍼유저 생성을 편리하게 도와주는 메서드
myapp/managers.py
class CustomUserManager(BaseUserManager):
- Django는 기본적으로
username
을 기준으로 사용자를 생성합니다. - 하지만 우리는
email
을 로그인 ID로 사용하고 싶으니,
그 방식에 맞는 사용자 생성 함수들을 직접 만들어줘야 합니다.
create_user()
메서드 : 일반 사용자 생성 메서드
def create_user(self, email, password=None, **extra_fields):
- 이메일이 없으면 오류
- 비밀번호는
set_password()
를 통해 해시 처리 - DB에 저장하고 사용자 인스턴스 반환
- 회원가입 시 이 함수가 호출됩니다.
create_superuser()
메서드:관리자(슈퍼유저) 생성 메서드
def create_superuser(self, email, password=None, **extra_fields):
- 관리자이므로
is_staff
,is_superuser
를 반드시True
로 지정 - 조건이 맞지 않으면 오류 발생
- 내부적으로
create_user()
를 호출해서 관리자 계정 생성 이 메서드는python manage.py createsuperuser
명령에서 사용됩니다.
myapp/models.py
CustomUser
모델 정의: 실제 사용자 모델 구조를 정의
class CustomUser(AbstractBaseUser, PermissionsMixin):
AbstractBaseUser
: 비밀번호 저장, 인증 관련 기능 제공PermissionsMixin
: 권한/그룹 관련 기능 제공
email = models.EmailField(...)
:로그인 ID로 사용할 이메일 필드 정의
unique=True
: 이메일이 중복되지 않게 강제함- 이 필드를 로그인 기준(
USERNAME_FIELD
)으로 쓸 예정
is_staff
, is_active
: 로그인 가능 여부 및 관리자 여부 설정
is_staff
: 관리자 사이트 접근 가능 여부is_active
: 계정 비활성화 여부
objects = CustomUserManager()
:사용자 생성 로직을 CustomUserManager
로 연결
- 이걸 생략하면
create_user()
같은 커스텀 메서드를 사용할 수 없습니다 - 매우 중요!
USERNAME_FIELD = 'email'
:로그인할 때 사용할 ID 필드 지정
- 기본값은
username
인데 우리는email
로 바꿔주는 것
settings.py
설정 추가: 프로젝트 전체에 새 사용자 모델을 알려주는 설정
'app'
은 해당 모델이 정의된 앱 이름- 이 설정을 하면 Django는
auth.User
대신app.CustomUser
를 기본 사용자 모델로 사용합니다. - ⚠️ 최초 마이그레이션 전에 반드시 설정되어야 합니다.