장고, 모델에서 db_table 외부 변경해보기

728x90
class User(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=20, blank=True, null=True)
age = models.IntegerField
class Meta:
managed = False
db_table = 'users'

보통은 Meta를 사용해 db_table 명을 지정하게 됩니다.

고정적으로 해당 모델은 하나의 DB를 사용한다 했을 때 사용합니다.

 

저는 이번에 날짜나 숫자에 따른 DB 테이블을 적용하기 위한 방법으로 사용해보았습니다.

class MarketExportResult(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=20, blank=True, null=True)
age = models.IntegerField()
@classmethod
def set_db_table(cls, table_name):
cls._meta.db_table = table_name

classmethod를 이용하여 table_name을 받아 db_table을 지정하게 했습니다.

User.set_db_table(f"users_240501")

users_240501 테이블을 사용하도록 했습니다.

 

------------------------------------------------------------------------추가-----------------------------------------------------------------------------------해당 방법으로의 문제는 한번 생성된 모델이 set_db_table을 통해 table_name이 변경되지 않는 점.

from django.db import models
def create_model(table_name):
class Meta:
managed = False # Django에 의한 모델 관리를 비활성화
db_table = table_name # 동적으로 테이블 이름 설정
model_class = type(
f'UserModel_{table_name}',
(models.Model,),
{
'__module__': __name__,
'id': models.AutoField(primary_key=True),
'name': models.CharField(max_length=20, blank=True, null=True),
'age': models.IntegerField(),
'Meta': Meta
}
)
return model_class

동적으로 model을 생성하여 사용할 수 있도록 합니다.

UserModel240501 = create_model('users_240501')
UserModel240502 = create_model('users_240502')
반응형