【问题标题】:Different database for each django site每个 django 站点的不同数据库
【发布时间】:2012-09-03 08:37:24
【问题描述】:

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

【问题讨论】:

    标签: database django django-sites


    【解决方案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/

    【讨论】:

    • 是的,我正在寻找这种路由解决方案,但是如何在路由器中获取站点名称?它似乎只允许传递 Model 。
    • Site.objects.get_current() 将为您提供当前站点,并且您可以缓存当前站点,这样它就不是数据库开销
    猜你喜欢
    • 2010-11-25
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 2011-03-18
    • 2016-01-18
    • 1970-01-01
    相关资源
    最近更新 更多