每个django站点的数据库不同

时间:2012-09-10 13:04:18

标签: database django django-sites

假设我们在同一个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 个答案:

答案 0 :(得分:0)

您可以创建自定义路由器来执行此操作:

示例:

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/