9

当 Django 创建表时,它会给它们以 app_class 形式的名称。我正在为 Django 安装改造一个不同的(但内容基本相似的)数据库。我的表名没有以 app_ 开头。

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

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

4

3 回答 3

7

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

$ django-admin.py inspectdb > models.py

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

模型.py

class DjangoSite(models.Model):
    domain = models.CharField(max_length=100)
    name = models.CharField(max_length=50)
    class Meta:
        db_table = u'site'
于 2012-12-19T05:32:01.180 回答
3

当然你可以在 Django 中完成,只需更改 Model 的元类:

from django.db.models.base import ModelBase

class ModelMetaClass(ModelBase):
    def __new__(cls, name, bases, attrs):
        new_class = super().__new__(cls, name, bases, attrs)

        new_class._meta.db_table = some_awesome_logic_implemented_by_you()

        return new_class

然后在模型中:

class DjangoSite(models.Model, metaclass=ModelMetaClass):
    # __metaclass__ = ModelMetaClass  # Python 2.x

    class Meta:
        pass

你就完成了!

于 2013-01-17T15:26:02.870 回答
1

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

旧选项.py

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

新选项.py

self.db_table = self.model_name
于 2012-12-20T15:30:09.000 回答