Notice
Recent Posts
Link
Tags
- ORM
- mysql
- 스프링
- 자바
- sql
- nginx
- @transactional
- Django
- AWS
- 문자열
- spring mvc
- string
- join
- 1차원 배열
- 데이터베이스
- PYTHON
- session
- Git
- spring boot
- jpa
- 스프링부트
- java
- springboot
- 프로그래머스
- SSL
- Docker
- select
- spring
- DI
- spring security 6
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Archives
개발하는 자몽
[Django] BaseModel (Tracking Model) 본문
백엔드 개발을 하면 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`도 포함되어 있는 것을 확인할 수 있다.
'Python > Django' 카테고리의 다른 글
[Django / TIL] ORM 쿼리 메서드 filter(), get() (0) | 2024.01.29 |
---|---|
[Django] Swagger를 이용한 API Documentation (0) | 2024.01.20 |
[Django] 배포 환경에서 Nginx로 media file 제공하기 on Docker (0) | 2024.01.13 |
[Django] 환경변수 관리 (django-environ) (1) | 2024.01.06 |
[Django] 개발 환경 분리 (1) | 2023.12.30 |
Comments