장고, 모델에서 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')
반응형