Разные базы данных для каждого сайта Django

Предположим, у нас есть несколько сайтов (использующих сайты-инфраструктуру Django), работающих на одном экземпляре django.

MyModel.objects.filter(site_id=request.site, slug=slug)[0] может быть накладные расходы в будущем. Поэтому мне было интересно, смогу ли я разделить базы данных для этой модели (моделей) для более быстрого запроса.

Так что если request.site 1, работает

MyModel.objects.get(slug=slug)

будет запрашивать только db1.

Если request.site 2, работает

MyModel.objects.get(slug=slug)

будет запрашивать только DB2.

Я буду получать request.site из параметра запроса представления, поскольку значение сайта будет определяться динамически в соответствии с используемым поддоменом: de, fr и т. Д.

1 ответ

Решение

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

Пример:

def get_current_site():
   SITE_ID = getattr(settings, 'SITE_ID', 1)
   site_name = Site.objects.get(id=SITE_ID)
   return site_name


DATABASE_ROUTERS = ['CustomDatabaseRouter',] #a setting that Django understands.

class CustomDatabaseRouter(object):

  def db_for_read(self, model, **hints):
     site_name = get_current_site()
     if site_name  in ['site1']:
         return 'db1'
     if site_name in ['site2']:
        return 'db2'
     return 'default'

  def db_for_write(self, model, **hints):
     site_name = get_current_site()
     if site_name  in ['site1']:
         return 'db1'
     if site_name in ['site2']:
        return 'db2'
     return 'default'

  def allow_syncdb(self, model, **hints):
     site_name = get_current_site()
     if site_name in ['site1'] and db == 'db1':
         return True
     if site_name in ['site2'] and db == 'db2':
        return True
     return False

Вы можете прочитать больше здесь https://docs.djangoproject.com/en/dev/topics/db/multi-db/

Другие вопросы по тегам