我试图在连接到现有Oracle数据库的Django实例中更优雅地表达我的数据库表。我们有大量现有的表,我想简单地表述为Django模型。当前,我有一个抽象基类,所有其他模型都继承自该基类。例如,
class PlatformTable(models.Model):
id = models.IntegerField(primary_key=True)
creation_date = models.DateTimeField()
last_modified_date = models.DateTimeField()
class Meta:
abstract = True
db_tablespace = 'platform'
managed = False
然后我们有一个从该抽象表继承的实际Account。我在Account的Meta类中生成了正确的表名。
class Account(PlatformTable):
ext_ref = models.CharField(max_length=40)
class Meta(PlatformTable.Meta):
db_table = table_name("Account")
def table_name(name):
"""Will convert a CamelCase class name to CAMEL_CASE so we can use it for
oracle table names."""
s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name)
table_name = re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).upper()
return u'"{schema}"."{table_name}"'.format(schema=SCHEMA, table_name=table_name)
是否有一种方法可以更改抽象模型,以便在子类这样子化时自动在Meta中生成正确的表名?理想情况下,我的帐户模型应该是
class Account(PlatformTable):
ext_ref = models.CharField(max_length=40)
到目前为止,我发现this(这不是一个很好的解决方案)和this(这是行不通的)。
是否可以扩展数据库连接器以即时重写表名?