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

Django表命名约定。我能改变它的行为吗?,django,django-models,Django,Django Models,当Django创建表时,它会给表命名为表单app_类。我正在为Django安装改造一个不同(但内容基本相似)的数据库。“我的表名”前面没有应用程序名称 我可以相应地重新创建数据库及其表,但我想看看Django是否有修改处理表名的灵活性 也就是说,我有一个coi_fs表-我想看看是否可以更改Django的安装,这样它就不会引用app_coi_fs,而只是coi_fs?如果您已经有一个数据库,我建议您使用数据库自省选项。这将创建使用当前数据库所需的模型 $ django-admin.py inspe

当Django创建表时,它会给表命名为表单app_类。我正在为Django安装改造一个不同(但内容基本相似)的数据库。“我的表名”前面没有应用程序名称

我可以相应地重新创建数据库及其表,但我想看看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-名称),您可以使用db_表元属性

models.py
如果要对所有表进行通用重命名,请编辑django source。这似乎很危险,但是如果您明确地想要更改Django安装,那么您可以尝试一下

旧选项.py 新选项.py
当然,您可以在Django中执行此操作,只需更改模型的元类:

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

你完了

看看这里:inspectdb选项实际上创建了带有db_table元字段的模型!这是维克多(我已经有)的有用信息,但它不能解决这个特殊问题。最后,我通过返回到我的创建数据库脚本并使用app\ux在表名前面加上前缀,解决了这个问题。我希望有一个更好的解决方案,但这样就行了。所以我不能给你的答案打分,但我可以给它一个+1。
self.db_table = self.model_name
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