models.Model의 역할
먼저 Django에서 가장 기본적인 모델 클래스는 models.Model
입니다. 모든 Django 모델은 models.Model
을 상속받아 정의됩니다. 이 클래스는 내가 정의한 모델을 데이터베이스 테이블로 매핑해주는 역할을 합니다. 각 모델 클래스는 데이터베이스의 테이블이고, 그 안에 있는 필드들은 테이블의 열(columns)이 됩니다.
중요한 점은 models.Model
을 상속받음으로써 기본적으로 사용할 수 있는 여러 유용한 메서드들이 제공된다는 것입니다:
save()
: 데이터베이스에 객체를 저장하는 메서드delete()
: 객체를 삭제하는 메서드objects.create()
: 새로운 객체를 생성하고 저장하는 메서드objects.filter()
: 특정 조건을 만족하는 객체를 조회하는 메서드
이러한 기능 덕분에 models.Model
을 상속받기만 하면 Django ORM의 강력한 기능을 손쉽게 사용할 수 있습니다.
AbstractUser와 CustomUser의 관계
Django에는 기본적으로 제공되는 auth.User
라는 내장 사용자 모델이 있습니다. 이 모델을 기본적으로 사용할 수도 있지만, 대부분의 경우 사용자 모델을 커스터마이징하고 싶어 합니다. 예를 들어, 전화번호나 주소 같은 추가 필드를 넣고 싶을 때가 있습니다.
이때 사용하는 것이 바로 AbstractUser
입니다. 이 클래스는 Django가 기본적으로 제공하는 사용자 모델(즉, auth.User
)을 확장할 수 있도록 만들어진 추상 클래스입니다. AbstractUser
역시 models.Model
을 상속받고 있으므로, 내가 AbstractUser
를 상속받아 CustomUser
를 정의하면 ORM의 모든 기능을 그대로 사용할 수 있습니다.
from django.contrib.auth.models import AbstractUser
from django.db import models
class CustomUser(AbstractUser):
phone_number = models.CharField(max_length=15, blank=True)
address = models.CharField(max_length=255, blank=True)
이렇게 정의된 CustomUser
모델은 사용자 인증과 관련된 모든 기능을 제공하면서, 추가적인 필드를 자유롭게 정의할 수 있습니다.
models.Manager와 AbstractUserManager의 역할
Django 모델에서 models.Manager
는 데이터베이스에 대한 쿼리를 처리하는 인터페이스 역할을 합니다. 기본적으로 제공되는 objects
매니저를 통해 데이터를 쉽게 조회하거나 조작할 수 있습니다. 예를 들어, filter()
, get()
, create()
같은 메서드들이 있습니다.
사용자 모델은 사용자 생성 로직이 필요할 때 AbstractUserManager
를 활용할 수 있습니다. AbstractUserManager
는 models.Manager
를 상속받아 사용자 생성에 특화된 메서드(create_user()
, create_superuser()
)를 제공합니다.
from django.contrib.auth.models import BaseUserManager
class CustomUserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
# 사용자 생성 로직
pass
def create_superuser(self, email, password=None, **extra_fields):
# 슈퍼유저 생성 로직
pass
이렇게 사용자 생성 로직을 커스터마이징하여 CustomUserManager
를 구현하면 더욱 유연하게 사용자 모델을 관리할 수 있습니다.
정리: 모델 클래스들 간의 관계
지금까지 Django의 모델 클래스들 간의 관계를 정리하면 다음과 같습니다:
models.Model
: 모든 Django 모델의 기반 클래스. 이를 상속받아 데이터베이스와 매핑하며, ORM 기능을 제공.AbstractUser
:models.Model
을 상속받은 추상 클래스. 이를 확장하여CustomUser
를 정의.AbstractUserManager
:models.Manager
를 상속받아 사용자 생성 로직을 커스터마이징 가능.
이 구조를 이해하고 활용하면 Django의 모델 시스템을 더욱 효율적으로 설계할 수 있습니다.
Add a New Comment