Вы можете легко сделать это, добавив в модель собственный атрибут:
class A(models.Model):
_DATABASE = "X"
class B(models.Model):
_DATABASE = "Y"
...
Затем вам нужно добавить маршрутизатор.Следующий выберет базу данных по полю _DATABASE, и модели без атрибута _DATABASE будут использовать default
базу данных, также отношения будут разрешены только для default
базы данных:
class CustomRouter(object):
def db_for_read(self, model, **hints):
return getattr(model, "_DATABASE", "default")
def db_for_write(self, model, **hints):
return getattr(model, "_DATABASE", "default")
def allow_relation(self, obj1, obj2, **hints):
"""
Relations between objects are allowed if both objects are
in the master/slave pool.
"""
db_list = ('default')
return obj1._state.db in db_list and obj2._state.db in db_list
def allow_migrate(self, db, model):
"""
All non-auth models end up in this pool.
"""
return True
И последний шаг - указать ваш маршрутизаторв settings.py:
DATABASE_ROUTERS = ['path.to.class.CustomRouter']
Кстати, это решение не будет работать, если вы собираетесь работать с отношениями «многие ко многим» в базе данных не по умолчанию, потому что реляционные модели не будут иметь «_DATABASE»Атрибут, в этом случае лучше использовать что-то вроде model._meta.app_label
в качестве условия фильтра в db_for_read / db_for_write