【问题标题】:In django models, how to make all table names not have the app label?在django模型中,如何让所有表名都没有app标签?
【发布时间】:2011-03-02 10:55:38
【问题描述】:

在我开始使用 django 为其编写 Web 界面之前,我有一个已被其他应用程序使用的数据库。表名遵循简单的命名标准,因此 django 模型 Customer 应该映射到 db 中的表“customer”。同时我正在添加新的表格/模型。因为我发现每次我必须在其他应用程序中编写查询时使用 app_customer 很麻烦(django 的 ORM 对他们来说绝对不够),而且我不想重命名现有的表,所以最好的方法是什么?我的 django 应用程序中的模型使用不带 applabel_ 的表,除了向每个模型添加带有 db_table= 的 Meta 类?

我有什么理由不应该这样做吗?我只有一个需要访问这个数据库的网络应用程序,其他一切都不使用 django 模型。

【问题讨论】:

  • 而不使用Meta类的原因是……?听起来你在说,“我想开车,但我不想用手。”
  • 原因是,django 自动以这种方式命名表,我应该能够禁用它并自动以我的方式命名。我什至不想要深奥的名字,只想要类的名字,就像 django 一样,除了 applabel_ 位。向每个类添加 Meta: db_table = className.lower() 似乎很愚蠢和重复。

标签: database django django-models


【解决方案1】:

您可以在模型类中添加一个Meta 类,并在其中将您的表名指定为db_table

Django Document

class Meta:
    db_table = 'my_author_table'

【讨论】:

    【解决方案2】:

    可能有效(我还没有测试过)

    class CustomModel(Model):
        def __init__(self, *args, **kwargs):
            self._meta.db_table = self.__class_.__name__.lower()
            super(CustomModel, self).__init__(*args, **kwargs)
    

    然后您从 CustomModel 继承所有模型。 虽然我不确定这是否值得,只是为了避免在 Meta 中指定它。

    【讨论】:

    • 当前项目有160多个模型表,值得。如果有关于是否会继续支持的文档,那就太好了。
    • 这似乎在我的实验中发生得不够早,无法影响真实的表名。然而,涉及较早运行的元类的技术似乎确实有效:stackoverflow.com/a/14382414/450917
    猜你喜欢
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-06-28
    • 2015-07-20
    • 2012-10-11
    相关资源
    最近更新 更多