@ermolushka

Как работать с несколькими БД в Django?

Привет. В settings.py я использую две базы: 'default' и 'admin_site'.

models.py
class Project(models.Model):
    name = models.CharField(max_length=256, verbose_name='Название проекта')

    def __str__(self):
        return "%s" % self.name

    class Meta(object):
        db_table='project'
        verbose_name = 'Проект'
        verbose_name_plural = 'Проекты'

class Clip(models.Model):
    name = models.TextField('Название', max_length=1000, blank=True)
    description = models.TextField('Описание', max_length=10000, blank=True)
    date = models.DateTimeField('Дата создания фильма', default=datetime.now())

    def __str__(self):
        return "%s" % self.name

    def save(self, force_insert=False, force_update=False, using='admin_site'):
        return super(Clip, self).save(using=using)

    class Meta(object):
        db_table='clip'
        verbose_name='Клип'
        verbose_name_plural='Клипы'


В классе Clip я явно прописываю, чтобы это сохранялось в таблицу в определенной БД. Также я написал Router

class ClipRouter(object):
    """
    A router to control all database operations on models in the
    auth application.
    """
    def db_for_read(self, model, **hints):
        """
        Attempts to read auth models go to auth_db.
        """
        if model._meta.app_label == 'clip':
            return 'admin_site'
        return None

    def db_for_write(self, model, **hints):
        """
        Attempts to write auth models go to auth_db.
        """
        if model._meta.app_label == 'clip':
            return 'admin_site'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        """
        Allow relations if a model in the auth app is involved.
        """
        if obj1._meta.app_label == 'clip' or \
           obj2._meta.app_label == 'clip':
           return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        """
        Make sure the auth app only appears in the 'auth_db'
        database.
        """
        if app_label == 'clip':
            return db == 'admin_site'
        return None


и прописал в settings.py

DATABASE_ROUTERS = ['path_to_router.ClipRouter'] #путь у меня нормальный, тут просто поменял


В итоге при попытке сохранения клипа, он в базу сохраняется, но на экарне вместо этого всплывает exception, что аткой таблицы нет. То есть он пытается сохранить в таблицу дефолтной БД, где ее физически нет.
  • Вопрос задан
  • 570 просмотров
Решения вопроса 1
un1t
@un1t
Попробуй проверять не app_label, а название класса молели. Ну и отладку никто не отменял - pdb или хотябы принтами.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы