개발하는 자몽

[Django] BaseModel (Tracking Model) 본문

Python/Django

[Django] BaseModel (Tracking Model)

jaamong 2024. 2. 9. 11:46

백엔드 개발을 하면 DB 테이블(또는 DB 엔티티)을 도메인 엔티티로 옮겨야 되는데, 이는 `Entity`나 `Model` 등으로 표현하게 된다. 여기서는 Django의 `Model`을 다뤄보려고 한다. 

 

각 DB 테이블에는 `created_at`이나 `updated_at`과 같은  공통된 필드가 들어가는 경우가 많다. 따라서 Entity나 Model에는 이 필드들이 반복해서 작성되는데, 생각보다 귀찮고 하다 보면 한 번에 처리할 방법이 없나 찾게 된다. Django에서는 `BaseModel`이라는 클래스에 이렇게 반복 작성되는 필드들을  모아서 선언한다. (SpringBoot 환경에서 JPA를 사용한다면 BaseEntity를 떠올릴 수 있다)

 

BaseModel

1. `manage.py`와 동일한 경로에 `helpers`라는 이름의 디렉토리를 생성한다.

2. `helpers` 디렉토리 안에 `models.py`를 생성한다.

3. 해당 파일에 아래와 같이 작성한다.

from django.db import models


# 모델 생성 시마다 유사한 필드를 적용해야할 때 BaseModel(Tracking Model) 사용
# 장고 모델 객체가 생성되거나 업데이트 될 때 등 대부분의 항목이 공통적으로 적용됨
# 모델 helper를 생성하여, 모델을 생성할 때 세부 정보를 한 번에 빠르게 추가할 수 있음
class BaseModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True

        # set up ordering by created_at descending
        ordering = ('-created_at', )

 

🔹 abstract = True

  • 해당 옵션이 적용된 모델은 실제로 존재하지 않는 가상의 클래스가 되어, DB 생성에 사용되지 않는다.
  • 이러한 모델을 상속받은 자식 모델은 부모 필드의 속성과 함수를 물려받으며, 실체가 있는 DB 테이블이 된다.
  • 이러한 특징으로 인하여 `Abstract Base Class`는 공통된 정보들을 가진 모델 클래스들이 있을 때 유용하게 사용된다.

 

사용

이렇게 만들어진 `BaseModel`은 아래와 같이 사용할 수 있다.

from django.db import models

from authentication.models import User
from helpers.models import BaseModel


class Todo(BaseModel):  # BaseModel 상속
    title = models.CharField(max_length=255)
    description = models.TextField() 
    is_complete = models.BooleanField(default=False)
    owner = models.ForeignKey(to=User, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

위와 같이 상속받은 후, `Todo` 모델 클래스를 생성 및 `migration` 해보자. DB에서 위의 모델 테이블을 확인해 보면 `created_at`과 `updated_at`도 포함되어 있는 것을 확인할 수 있다.

 

 

 

Comments