Django에서 models 데이터의 생성 시간, 업데이트 시간을 기록하기 위해 created_at, updated_at 필드를 생성하여 관리하여 주는데 이 필드들은 모델을 생성할 때마다 넣어줘야 한다. 예를 들어 게시물, 유저, 댓글 등등 많은 부분에서 중복사용되고 우리는 이러한 중복사용을 최소하 하기 위한 방법이 바로 추상화 클래스이다.
추상화 클래스는 모델 클래스의 추상화 버전으로, 실제 데이터베이스에 저장되지 않는 클래스이다. 이 클래스는 상속을 통해 다른 클래스에 적용시켜줄수있다. 가장 흔히 접했던 추상화 클래스는 'AbstractBaseUser', 'AbstractUser', 'AbstractBaseClass', 'AbstractMethod' 등이 있는데 이 추상화 클래스를 이용하여 나는 앞서 이야기했던 created_at, updated_at을 관리해주려고 한다.
이렇게 하면 공통된 기능을 추상화하여 구현할 수 있어서 코드의 재사용성과 유지 보수성이 높아진다는 장점이 있다.
추상화 클래스 만들고 사용하기
core
1. 추상화 클래스는 일반적으로 core라는 앱 안에 만든다. 만약 core가 없다면 startapp으로 생성해 주자.
2. core/models.py에 추상화할 모델을 생성하여 주면 된다.
from django.db import models
from django.utils import timezone
class TimeStampedModel(models.Model):
created_at = models.DateTimeField(default=timezone.now)
updated_at = models.DateTimeField(default=timezone.now)
class Meta:
abstract = True
메타클래스에 abstaract = True 부분을 해줘야 상속하려 했던 데이터 모델이 데이터 베이스로 들어가지 않고 제대로 사용할 수 있다.
사용하기
사용하는 법은 간단하다. 사용하고 싶은 모델에 TimeStampedModel을 상속하여 주면 된다. 아래는 User 모델에 상속하여 준 부분이다.
class User(TimeStampedModel, AbstractBaseUser, PermissionsMixin):
email = models.EmailField(_('email address'), unique=True)
name = models.CharField(_('name'), max_length=10, blank=True, null=True)
nickname = models.CharField(_('nickname'), max_length=20, unique=True)
profile_image = models.CharField(_('profile image'), max_length=255, blank=True, null=True)
birthday = models.DateField(_('birthday'), max_length=10, blank=True, null=True)
job = models.CharField(_('job'), max_length=30, blank=True, null=True)
career = models.CharField(_('career'), max_length=4, blank=True, null=True)
is_staff = models.BooleanField(_('staff status'), default=False, help_text=_('Designates whether the user can log '
'into this admin site.'),)
objects = UserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
class Meta:
db_table = "user"
verbose_name = _('user')
verbose_name_plural = _('users')
swappable = 'AUTH_USER_MODEL'
코드가 길어서 다소 헷갈릴 수도 있는데? 다른 부분은 기존 유저 모델과 똑같은데 추가된 부분은 User 모델을 정의하여 줄 때 TimestampedModel을 추가하여 준 부분만 다르다. 이렇게 하고 마이그레이션을 해주면 아래와 같이 TimestampModel에서 정의해 준 모델을 가지고 와서 사용할 수 있게 된다.
'Django > DRF' 카테고리의 다른 글
Django의 OneToOneField와 ForeignKey의 차이점 (0) | 2023.05.23 |
---|---|
Django 모델 관계에 대한 이해 - 양방향 참조와 단방향 참조 (0) | 2023.05.23 |
Django에서 루트파일 밑에 test파일을 만드는 이유 (0) | 2023.05.11 |
Django 소셜로그인 구현 / 카카오톡 (0) | 2023.05.08 |
Django - settings.py 분리하기(base.py/local.py) (0) | 2023.05.03 |