Django多数据库&x2014;读自;只读“;联系;提交事务,并让以下所有查询使用;“违约”;连接

Django多数据库&x2014;读自;只读“;联系;提交事务,并让以下所有查询使用;“违约”;连接,django,transactions,django-queryset,multiple-databases,Django,Transactions,Django Queryset,Multiple Databases,我有两个数据库: #配置 数据库={ 'default':{}, “只读”:{}, } 在后台任务中,我想从“只读”数据库中提取数据,然后使用“默认”数据库保存: #任务 things=Thing.objects.using('readonly').all() util.do_stuff_with_things(things)#理想情况下,我不想将`using`作为我所有实用程序的必需参数 我可以在所有实用程序上手动指定save(使用class='default'),但很难找到它们。我宁愿提

我有两个数据库:

#配置
数据库={
'default':{},
“只读”:{},
}
在后台任务中,我想从“只读”数据库中提取数据,然后使用“默认”数据库保存:

#任务
things=Thing.objects.using('readonly').all()
util.do_stuff_with_things(things)#理想情况下,我不想将`using`作为我所有实用程序的必需参数
我可以在所有实用程序上手动指定
save(使用class='default')
,但很难找到它们。我宁愿提交事务,然后在默认连接上启动新事务

我所尝试的:

  • 设置自动提交
  • transaction.set\u autocommit(False,使用='readonly')
    thing=thing.objects.using('readonly').first()
    commit(使用='readonly')
    transaction.set_autocommit(True,使用='default')
    thing.save()#`save`仍然需要`using='default'`,“InternalError:无法在只读事务中执行更新”
    
  • 拉入
    原子
  • 带有transaction.atomic的
    (使用='readonly'):
    thing=thing.objects.using('readonly').first()
    thing.save()#`save`仍然需要`using='default'`,“InternalError:无法在只读事务中执行更新”
    
  • 覆盖
    \u state.db
  • 这很管用,但我不喜欢:(

    thing=thing.objects.using('readonly').first()
    东西。_state.db='default'
    保存
    

    现在,我可能会选择#3,因为它对我正在使用的实用程序的干扰最小。但我想知道是否有更好的方法!

    谢谢@arakkal abu,我一直在寻找数据库路由器

    BGTaskDatabaseRouter类:
    def db_用于_读取(自身、型号、**提示):
    返回“只读”
    def db_用于_写入(自身、型号、**提示):
    返回“默认值”
    
    在我的设置文件中:

    数据库_路由器=[]
    如果是背景任务:
    DATABASE_ROUTERS.append('DATABASE_ROUTERS.BGTaskDatabaseRouter'
    
    可能是这个?