2

Suppose we have multiple sites (using sites-framework of Django) running on the same django instance.

MyModel.objects.filter(site_id=request.site, slug=slug)[0] might be an overhead in the future. So I was wondering if I could split the databases for this model(s) for querying faster.

So if request.site is 1, running

MyModel.objects.get(slug=slug)

will query only db1.

If request.site is 2, running

MyModel.objects.get(slug=slug)

will query only db2.

I will be getting request.site from the request parameter of the view as value of site will be dynamically determined according to the subdomain used: de, fr, etc.

César
  • 9,939
  • 6
  • 53
  • 74
aladagemre
  • 592
  • 5
  • 16

1 Answers1

1

You may create a custom router to do this:

Example:

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

You can readup more here https://docs.djangoproject.com/en/dev/topics/db/multi-db/

karthikr
  • 97,368
  • 26
  • 197
  • 188
  • Yes, I'm looking this kind of routing solution but how can I get the site_name in a router? It seems to allow passing only the Model . – aladagemre Sep 10 '12 at 14:40
  • Site.objects.get_current() would give you the current site, and you could cache the current site, that way it is not a database overhead – karthikr Sep 10 '12 at 14:55