2

假设我们有多个站点(使用 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 等。

4

1 回答 1

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/

于 2012-09-10T14:16:47.260 回答