@k0r0g

Как работают маршрутизаторы баз данных?

Здравствуйте. У меня есть 2 таблицы. Хочу разнести их по разным базам. Одна в дефолтной, другая - в новой.
Файл settings:
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
    'registrations': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': '../db.sqlite3'
    }
}
DATABASE_ROUTERS = ['nails.router.RegRouter']

Файл router, лежит в одной папке с settings:
class RegRouter:
    def db_for_read(self, model, **hints):
        if model._meta.db_table == 'registrations':
            return 'registrations'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.db_table == 'registrations':
            return 'registrations'
        return None

Мои модели:
class Service(models.Model):
    title = models.CharField('Название услуги', max_length=100, name="title")
    cost = models.DecimalField('Стоимость', name="cost", max_digits=6, decimal_places=2)
    duration = models.IntegerField('Длительность в минутах', name="duration")
    image = models.ImageField('Изображение карточки', upload_to="main/static/main/img")

    def __str__(self):
        return self.title


class Registration(models.Model):
    title = models.CharField('Тест', max_length=100, name="title", default='')

    def __str__(self):
        return self.title

    class Meta:
        db_table = 'registrations_table'

Почему когда я выполняю миграцию все таблицы записываются в обе базы данных?
(очевидно, миграцию второй я провожу как python manage.py migrate --database=registrations)
Как мне избежать этого? Чего я в роутере неправильно сделал?
  • Вопрос задан
  • 80 просмотров
Решения вопроса 1
@k0r0g Автор вопроса
Я полный дурень. Не сделал алгоритм разрешения миграций.
Получилось как-то так. Поправьте, если можно лучше
spoiler
class RegRouter:
    def db_for_read(self, model, **hints):
        if model._meta.db_table == 'registrations_table':
            return 'registrations'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.db_table == 'registrations_table':
            return 'registrations'
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if db == 'registrations' and model_name == 'registration':
            return True
        if db == 'registrations' and model_name != 'registration':
            return False
        if db == 'default' and model_name == 'registration':
            return False
        else:
            return True
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы