从django中具有相同表名的多个数据库中获取数据

sqe*_*sqe 12 python mysql database django

我需要从Django中的不同导入的MySQL数据库中获取数据 (Django 1.11.7,Python 3.5.2).我运行manage.py inspectdb --database '<db>'然后在django中使用模型.

到现在为止,我只需要访问具有不同名称的表.为此,我使用usingqueryset中的关键字指定相应的数据库,然后连接结果,如下所示:

from ..models.db1 import Members
from ..models.db2 import Actor

context['db1_data'] = Members.objects.using('db1').filter...
context['db2_data'] = Actor.objects.using('db1').filter...

context["member_list"] = list(chain(
    context["db1_data"],
    context["db2_data"],
))

return context
Run Code Online (Sandbox Code Playgroud)

现在我遇到的问题是两个数据库中存在具有相同模型名称的表.使用上述方法时我得到以下错误(我替换了名称):

RuntimeError: Conflicting '<table-name>' models in application '<app>': <class '<app>.<subfolder>.models.<db1>.<table-name>'> and <class '<app>.<subfolder>.models.<db2>.<table-name>'>.
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用不同的名称导入模型,如下所示:

from ..models.db3 import Members as OtherMembers
Run Code Online (Sandbox Code Playgroud)

但错误仍然出现.

不应该from ..models.db1并且from ..models.db2足够清楚Django能够发现两种型号之间的差异吗?

一种选择可能是重命名模型本身,但这意味着重命名具有相同名称的每个数据库模型.由于我将来会使用更多的数据库,这对我来说不是一个选择.

我试过from models import db1, db2然后db1.Members等等,这仍然引发了错误.

我读到了meta db_table = 'dbname.tablename'-option,但由于模型是自动生成的inspectdb,所以每个类都有类似的东西:

class MyModel(models.Model):
    <models>

    class Meta:
        managed = False
        db_table = 'my_model'
Run Code Online (Sandbox Code Playgroud)

如前所述,其他数据库具有完全相同的模型,因此具有相同的Meta类.我不能也不想改变每个Meta类.


编辑:

我的项目结构如下所示:

app
    -> admin.py
    -> ...
    -> models.py
    -> views.py
    subfolder
        -> models
            -> db1.py
            -> db2.py
        -> views
            -> db1.py
            -> db2.py
Run Code Online (Sandbox Code Playgroud)

Joh*_*fis 5

假设您已正确设置多个数据库

  1. 您是否尝试过添加自定义路由器
    如果不遵循文档链接上给出的示例。

  2. 您是否尝试过为您的模型使用自定义管理器

    为每个模型创建一个管理器,如下所示:

    class YourModelManagerX(models.Manager):
        def get_queryset(self, *args, **kwargs):
            return super().get_queryset(*args, **kwargs).using('your_db_X')
    
    Run Code Online (Sandbox Code Playgroud)

    然后将其作为objects字段添加到适当的模型中:

    class YourModel(models.Model):
        ...
        fields
        ...
        objects = YourManagerX()
    
        class Meta:
            managed = False
    
    Run Code Online (Sandbox Code Playgroud)

您可能需要同时尝试两者。