我必须运行2个不同的Django项目,这些项目必须共享同一个数据库。
他们必须共享同一个数据库,因为我需要在两个项目之间使用Django Models关系(Django不允许跨多个DB的关系)
有没有办法拥有全局前缀变量,以便Django自动使用它来生成所有表? 例如:
答案 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
。
但我没有测试......