2013-11-11 6 views
1

Я искал все решения для этого, но не смог найти что-либо.Несколько баз данных Django - модель карты для базы данных в одном приложении

У меня есть один проект Django, одно приложение, две модели и две базы данных. Я хотел бы, чтобы одна модель говорила и синхронизировалась исключительно с одной базой данных. Это то, что я пробовал:

Настройки

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 
     'NAME': 'database_a',      # Or path to database file if using sqlite3. 
     # The following settings are not used with sqlite3: 
     'USER': 'user', 
     'PASSWORD': 'xxxxxx', 
     'HOST': 'localhost',      # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP. 
     'PORT': '',      # Set to empty string for default. 
    }, 
    'applicationb_db': { 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'database_b', 
     'USER': 'user', 
     'PASSWORD': 'xxxxxx', 
     'HOST': 'localhost', 
     'PORT': '',     
    }, 
} 
DATABASE_ROUTERS = ['fanmode4.router.ApiRouter'] 

Модели

from django.db import models 

class TestModelA(models.Model): 
    testid = models.CharField(max_length=200) 
    class Meta: 
     db_table = 'test_model_a' 

class TestModelB(models.Model): 
    testid = models.CharField(max_length=200) 
    class Meta: 
     db_table = 'test_model_b' 
     app_label = 'application_b' 

маршрутизатор

class ApiRouter(object): 
    def db_for_read(self, model, **hints): 
     if model._meta.app_label == 'application_b': 
      return 'applicationb_db' 
     return None 

    def db_for_write(self, model, **hints): 
     if model._meta.app_label == 'application_b': 
      return 'applicationb_db' 
     return None 

    def allow_relation(self, obj1, obj2, **hints): 
     if obj1._meta.app_label == 'application_b' or \ 
      obj2._meta.app_label == 'application_b': 
      return True 
     return None 

    def allow_syncdb(self, db, model): 
     if db == 'applicationb_db': 
      return model._meta.app_label == 'application_b' 
     elif model._meta.app_label == 'application_b': 
      return False 
     return None 

имя приложения «api». В основном с этой настройкой, если я синхронизирую базу данных, она будет синхронизироваться только по умолчанию db. Если я синхронизирую базу данных с указанием второй базы данных python manage.py syncdb --database=applicationb_db, она ничего не синхронизирует со второй базой данных.

Я просто пытаюсь добиться следующего:

  • Все для TestModelA идет по умолчанию в базе данных
  • Все для TestModelB идет в applicationb_db БД При
  • Все остальное идет в базу данных по умолчанию

ответ

2

Вместо того, чтобы использовать model._meta.app_label, вы можете использовать model, чтобы проверить, какая именно модель, и вернуть соответствующую БД.

Вы можете обновить маршрутизатор как:

class ApiRouter(object): 
    def db_for_read(self, model, **hints): 
     if model == TestModelB: 
      return 'applicationb_db' 
     return None 

    def db_for_write(self, model, **hints): 
     if model == TestModelB: 
      return 'applicationb_db' 
     return None 

    def allow_relation(self, obj1, obj2, **hints): 
     if model == TestModelB: 
      return True 
     return None 

    def allow_syncdb(self, db, model): 
     if model == TestModelB: 
      return True 
     else: 
      return False 
     return None 
+0

Привет @Rohan спасибо, что нашли время, чтобы ответить. Когда я попробовал свой ответ, я получаю «NameError: глобальное имя« TestModelB »не определено». Если я попытаюсь поместить имя модели в одинарные кавычки, она просто ничего не синхронизирует. –

+0

@MarkWinterbottom, добавьте 'из моделей import TestModelB' в код. – Rohan

+0

Привет, Рохан, спасибо за вашу помощь. Я не думаю, что вы можете импортировать модели в класс маршрутизатора, потому что я получаю сообщение об ошибке «django.core.exceptions.ImproperlyConfigured: Ошибка импорта маршрутизатора базы данных ApiRouter:« Без модуля с именем модели »« –

Смежные вопросы