Подтвердить что ты не робот

Установить db на модель в django

Я просматривал django multi-db docs. Я хотел бы разбить несколько моих моделей на другой db. Но я действительно хочу, чтобы эти модели ВСЕГДА жили в конкретном дБ. Мне не нужна специальная маршрутизация. И написав уникальные маршрутизаторы, чтобы сказать "Модели A, B и C живут в базе данных X, модели D, E и F всегда живут в базе данных Y".

Существует ли более простой способ установки значений по умолчанию? Например, в качестве мета-поля модели?

4b9b3361

Ответ 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