2

同じdjangoインスタンスで複数のサイト(sites-Djangoのフレームワークを使用)が実行されているとします。

MyModel.objects.filter(site_id=request.site, slug=slug)[0]将来的にはオーバーヘッドになる可能性があります。そのため、このモデルのデータベースを分割してクエリを高速化できるかどうか疑問に思いました。

したがって、request.siteが1の場合、実行中

MyModel.objects.get(slug=slug)

db1のみを照会します。

が2の場合request.site、実行中

MyModel.objects.get(slug=slug)

db2のみを照会します。

サイトの値は使用されるサブドメイン(de、frなど)に従って動的に決定されるため、ビューのリクエストパラメータからrequest.siteを取得します。

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 に答える