【问题标题】:Django model db_table inheritance/injectionDjango 模型 db_table 继承/注入
【发布时间】:2015-09-30 12:27:29
【问题描述】:

出于报告目的,我正在 Django 和 AWS Redshift 之间进行集成。到目前为止,感觉 django 的表现并不好。我遇到的一个问题是我必须为每个模型设置一个替代类型 id,而不是 AutoField 类型,因为它在 redshift 中不受支持。 到目前为止一切都很好,但我想如果我已经为我要使用的所有模型做一个超类,我会在途中更改表名,我不喜欢 django 提供的默认名称它是数据库中的模型(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)

这样的事情可能吗?

【问题讨论】:

    标签: django django-models django-inheritance


    【解决方案1】:

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

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

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

    不过,要回答您的主要问题,这是可能的——但只能通过模型​​元类的一些非常复杂的覆盖(不要与模型的元类混淆......)。几乎可以肯定,这将比它的价值更麻烦。

    【讨论】:

    • 你说得对,谢谢。您能否向我推荐有关元类覆盖的任何资源?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    相关资源
    最近更新 更多