0

为了报告的目的,我正在 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)

这样的事情甚至可能吗?

4

1 回答 1

0

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

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

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

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

于 2015-09-30T12:57:52.840 回答