установить дБ для модели в Джанго - PullRequest
14 голосов
/ 05 января 2012

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

Есть ли более простой способ установить значения по умолчанию, как это? Например, в качестве модельного метаполя?

Ответы [ 2 ]

16 голосов
/ 16 марта 2015

Вы можете легко сделать это, добавив в модель собственный атрибут:

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

5 голосов
/ 05 января 2012

Для этого нет поля Meta (в какой-то момент оно было, но оно было удалено из-за введенных ограничений).Вам нужен маршрутизатор базы данных , чтобы контролировать, какие объекты идут в какую базу данных.В вашем случае маршрутизатор должен быть довольно простым в реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...