Django模型db_表继承/注入

Django模型db_表继承/注入,django,django-models,django-inheritance,Django,Django Models,Django Inheritance,为了便于报告,我正在Django和AWS Redshift之间进行集成。到目前为止,感觉django的表现并不好。我遇到的一个问题是,我必须为每个模型设置一个替代类型id,而不是AutoField类型,因为红移不支持它。 到目前为止还不错,但是我想如果我已经为我要使用的所有模型做了一个超级类,我会在途中更改表名,我不喜欢django在db app_name_model_name中为它的模型指定的默认名称。我设法做到了每一个子模型见下文。但是我想在BaseModel中动态地声明它,这样每个子模型将

为了便于报告,我正在Django和AWS Redshift之间进行集成。到目前为止,感觉django的表现并不好。我遇到的一个问题是,我必须为每个模型设置一个替代类型id,而不是AutoField类型,因为红移不支持它。 到目前为止还不错,但是我想如果我已经为我要使用的所有模型做了一个超级类,我会在途中更改表名,我不喜欢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)
这样的事情可能吗

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

id = CharField(primary_key=True, max_length=36, default=uuid4)
尽管还要注意Django 1.8引入了UUIDField,所以您可以直接使用它


不过,为了回答您的主要问题,这是可能的——但只有通过一些非常复杂的模型元类重写,才能避免与模型的元类混淆。。。。这几乎肯定会比它的价值更麻烦。

您的id是对的,谢谢。你能让我参考有关元类重写的任何资源吗?