Мне нужно получить данные из разных импортированных MySQL-баз данных в Django (Django 1.11.7, Python 3.5.2). Я запускаю manage.py inspectdb --database '<db>'
и затем использую модели в django.
До сих пор у меня был доступ только к таблицам с разными именами. Для этого я использовал ключевое слово using
в наборе запросов, чтобы указать подходящую базу данных, а затем конкатенировал результат, например так:
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
Теперь у меня проблема в том, что в двух базах данных есть таблицы с одинаковыми названиями моделей. Я получаю следующую ошибку при использовании вышеупомянутого метода (я подставил имена):
RuntimeError: Conflicting '<table-name>' models in application '<app>': <class '<app>.<subfolder>.models.<db1>.<table-name>'> and <class '<app>.<subfolder>.models.<db2>.<table-name>'>.
Я уже пытался импортировать модель с другим именем, например так:
from ..models.db3 import Members as OtherMembers
но ошибка все еще появляется.
from..models.db1
и from..models.db2
должно быть достаточно ясно, чтобы Джанго мог определить разницу между двумя моделями?
Вероятно, одним из вариантов будет переименование самих моделей, но это будет означать переименование каждой модели базы данных с одинаковыми именами. Поскольку в будущем я буду использовать гораздо больше баз данных, это не вариант для меня.
Я пытался from models import db1, db2
а затем db1.Members
и т.д., db1.Members
все еще вызывает ошибку.
Я читал о meta db_table = 'dbname.tablename'
-option, но, поскольку модель генерируется автоматически с помощью inspectdb
, она уже имеет что-то подобное в каждом классе:
class MyModel(models.Model):
<models>
class Meta:
managed = False
db_table = 'my_model'
Как описано выше, другая база данных имеет точно такую же модель и, следовательно, те же мета-классы. Я не могу и не хочу менять каждый класс Meta.
РЕДАКТИРОВАТЬ:
Моя структура проекта выглядит так:
app
-> admin.py
-> ...
-> models.py
-> views.py
subfolder
-> models
-> db1.py
-> db2.py
-> views
-> db1.py
-> db2.py