当 Django 创建表时,它会给它们以 app_class 形式的名称。我正在为 Django 安装改造一个不同的(但内容基本相似的)数据库。我的表名没有以 app_ 开头。
我可以相应地重新创建我的数据库及其表,但我想看看 Django 是否可以灵活地修改它处理表名的方式。
也就是说,我有一个表 coi_fs - 我想看看我是否可以更改 Django 安装,使其不引用 app_coi_fs 而只是引用 coi_fs?
当 Django 创建表时,它会给它们以 app_class 形式的名称。我正在为 Django 安装改造一个不同的(但内容基本相似的)数据库。我的表名没有以 app_ 开头。
我可以相应地重新创建我的数据库及其表,但我想看看 Django 是否可以灵活地修改它处理表名的方式。
也就是说,我有一个表 coi_fs - 我想看看我是否可以更改 Django 安装,使其不引用 app_coi_fs 而只是引用 coi_fs?
如果您已经有一个数据库,我建议您使用数据库自省选项。这将创建按原样使用当前数据库所需的模型。
$ django-admin.py inspectdb > models.py
不过,要从文档(https://docs.djangoproject.com/en/dev/ref/models/options/#table-names)回答您的原始问题,您可以使用 db_table 元属性。
class DjangoSite(models.Model):
domain = models.CharField(max_length=100)
name = models.CharField(max_length=50)
class Meta:
db_table = u'site'
当然你可以在 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
你就完成了!
如果要通用重命名所有表,请编辑 django 源。这似乎很危险,但如果您明确想要更改 Django 安装而不是它。https://github.com/django/django/blob/master/django/db/models/options.py
self.db_table = "%s_%s" % (self.app_label, self.model_name)
self.db_table = self.model_name