Разные базы данных для каждого сайта 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/