带有表前缀的Django项目

时间:2018-06-04 20:56:06

标签: mysql django

我必须运行2个不同的Django项目,这些项目必须共享同一个数据库。

他们必须共享同一个数据库,因为我需要在两个项目之间使用Django Models关系(Django不允许跨多个DB的关系)

有没有办法拥有全局前缀变量,以便Django自动使用它来生成所有表? 例如:

  • project1_auth_user
  • project2_auth_user
  • ...
  • project1_django_migrations
  • project2_django_migrations
  • ...

2 个答案:

答案 0 :(得分:1)

到目前为止,我已经解决了这个问题:

我为名为 table_router.py 的每个项目创建了一个文件,我在默认应用中初始化了该文件。

DEFAULT_APPS = [
  'commons.table_router',
  'django.contrib.contenttypes',
  'suit',
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
]

然后在这个文件中我有以下内容:

from django.conf import settings
from django.db.models.signals import class_prepared, pre_init

def add_db_prefix(sender, **kwargs):

    ours = sender._meta.managed
    prefix = getattr(settings, "project1_", None)

    if not ours:
        return

    if prefix and not sender._meta.db_table.startswith(prefix):
        sender._meta.db_table = prefix + sender._meta.db_table

pre_init.connect(add_db_prefix)
class_prepared.connect(add_db_prefix)

这样做的是,所有设置为由模型元信息中的 project1 管理的模型,前缀 project1 _ 都会添加到Django要查找的表名中。这样做,Django读取带有project1_前缀的auth_和django_表,否则查找我在Models table_name中定义的表名(表不是由project1管理的,而是来自project2)。

project2的相同文件,但带有project2前缀。

答案 1 :(得分:0)

这是一个有趣的问题,所以我在源代码中进行了搜索(因为docs仅告诉我们如何构建表名,而不是写入的位置)

在django / db / models / options.py中我发现:

if not self.db_table:
    self.db_table = "%s_%s" % (self.app_label, self.model_name)
    self.db_table = truncate_name(self.db_table, connection.ops.max_name_length())

也许这可以帮到你...

我假设,如果你在那里写了另一个前缀,它将改变默认的表名。我还假设,您可以在项目的某个地方从models.Model继承自己的模型类,通过带有前缀的更改版本覆盖contribute_to_class()(上面的行所在的位置),然后构造来自本地班级的所有模型,而不是models.Model

但我没有测试......