Django表命名约定。我可以改变它的行为吗?

时间:2012-12-19 00:58:38

标签: django django-models

当Django创建表格时,它会为它们提供表单app_class的名称。我正在将一个不同的(但内容基本相似)数据库改造成Django安装。我的表名称不会附加app _。

我可以相应地重新创建我的数据库及其表,但我想看看Django是否可以灵活地修改它如何处理表名。

也就是说,我有一个表coi_fs - 我想看看我是否可以更改Django安装,以便它不会引用app_coi_fs而只是引用coi_fs?

3 个答案:

答案 0 :(得分:5)

如果您已有数据库,我建议您使用数据库内省选项。这将创建按原样使用当前数据库所需的模型。

$ django-admin.py inspectdb > models.py

要回答原始问题,可以从文档(https://docs.djangoproject.com/en/dev/ref/models/options/#table-names)中使用db_table元属性。

models.py

class DjangoSite(models.Model):
    domain = models.CharField(max_length=100)
    name = models.CharField(max_length=50)
    class Meta:
        db_table = u'site'

答案 1 :(得分:1)

当然你可以在django中完成,只需更改模型的元类:

class (ModelBase):
    def __new__(cls, name, bases, attrs):
        klas = super(ChemblModelMetaClass, cls).__new__(cls, name, bases, attrs)

        klas._meta.db_table = someAwesomeLogicImplementedByYou

        return klas

然后在对象中:

class DjangoSite(models.Model):
    __metaclass__ = ModelMetaClass

    class Meta:
        pass

你完成了!

答案 2 :(得分:0)

如果要通用重命名所有表,请编辑django源。这似乎很危险,但如果你明确想要改变Django安装而不是它。 https://github.com/django/django/blob/master/django/db/models/options.py

旧的options.py

self.db_table = "%s_%s" % (self.app_label, self.module_name)

new options.py

self.db_table = self.module_name