Установить db на модель в django
Я просматривал django multi-db docs. Я хотел бы разбить несколько моих моделей на другой db. Но я действительно хочу, чтобы эти модели ВСЕГДА жили в конкретном дБ. Мне не нужна специальная маршрутизация. И написав уникальные маршрутизаторы, чтобы сказать "Модели A, B и C живут в базе данных X, модели D, E и F всегда живут в базе данных Y".
Существует ли более простой способ установки значений по умолчанию? Например, в качестве мета-поля модели?
Ответы
Ответ 1
Для этого нет поля Meta
(в какой-то момент был один, но он был удален из-за введенных ограничений). Для управления тем, какие объекты переходят в какую базу данных, вам нужен маршрутизатор базы данных. В вашем случае маршрутизатор должен быть легко реализован.
Ответ 2
Вы можете легко сделать это, указав собственный атрибут для модели:
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