Django模型db_table继承/注入

时间:2015-09-30 12:27:30

标签: django django-models django-inheritance

我正在进行Django和AWS Redshift之间的集成以进行报告。到目前为止,感觉django并没有做得好。我遇到的一个问题是我必须为每个模型设置一个替代类型id,而不是AutoField类型,因为它在redshift中不受支持。 到目前为止一切都那么好,但我想如果我已经为我要使用的所有模型做了一个超级类我将在路上更改表名,我不喜欢django给出的默认名称它是db(app_name__model_name)中的模型。我设法为每个子模型做到这一点(见下文)。但我想在BaseModel中动态声明它,每个子模型都会根据它的类名接收它自己的表名。

class BaseModel(Model):
    id = CharField(primary_key=True, max_length=36)

    class Meta:
        abstract = True

    def __init__(self, *args, **kwargs):
        super(RedshiftBaseModel, self).__init__(*args, **kwargs)
        self.id = str(uuid4())


class SubModel1(BaseModel):
    class Meta(BaseMode.Meta):
        db_table = 'SubModel1'

    field1 = CharField(max_length=64, primary_key=True)


class SubModel2(BaseModel):
    class Meta(BaseMode.Meta):
        db_table = 'SubModel2'

    field2 = CharField(max_length=64, primary_key=True)

这样的事情甚至可能吗?

1 个答案:

答案 0 :(得分:0)

首先,您肯定不想在self.id方法中设置__init__;每次实例化一个项时都会调用它,即使从数据库加载它,在这种情况下也会覆盖db ID。更好的是将其设为默认值:

id = CharField(primary_key=True, max_length=36, default=uuid4)

(虽然也注意到Django 1.8引入了UUIDField,所以你可以使用它。)

回答你的主要问题,但这是可能的 - 但只能通过一些非常复杂的模型元类重写(不要与模型的元类混淆......)。它几乎肯定会比它的价值更麻烦。