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)
您是否尝试过添加自定义路由器?
如果不遵循文档链接上给出的示例。
您是否尝试过为您的模型使用自定义管理器?
为每个模型创建一个管理器,如下所示:
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)您可能需要同时尝试两者。
| 归档时间: |
|
| 查看次数: |
1399 次 |
| 最近记录: |