Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database Django多数据库和;无法在只读事务中执行";错误_Database_Django - Fatal编程技术网

Database Django多数据库和;无法在只读事务中执行";错误

Database Django多数据库和;无法在只读事务中执行";错误,database,django,Database,Django,我使用在主从配置中设置多个数据库。我的路由器设置正确,并且我可以看到读写操作进入了正确的相应数据库,但是我的一些API调用遇到了错误: 无法在只读事务中执行[更新或删除] 在发生这种情况的API处理程序中,作为同一调用的一部分,我正在更新或删除一些其他模型,Django似乎希望对这些事务使用从属数据库,而不是主数据库 是在update()或delete()之前使用('default')链接。这基本上迫使Django使用主数据库进行更新或删除。但这感觉很粗糙,有绷带的味道,所以我想确定没有更好的方

我使用在主从配置中设置多个数据库。我的路由器设置正确,并且我可以看到读写操作进入了正确的相应数据库,但是我的一些API调用遇到了错误:

无法在只读事务中执行[更新或删除]

在发生这种情况的API处理程序中,作为同一调用的一部分,我正在更新或删除一些其他模型,Django似乎希望对这些事务使用从属数据库,而不是主数据库

是在
update()
delete()
之前使用('default')链接
。这基本上迫使Django使用主数据库进行更新或删除。但这感觉很粗糙,有绷带的味道,所以我想确定没有更好的方法


非常感谢您的帮助。

您尝试过以下方法吗?这是从Django文档页面复制的:

import random

class MasterSlaveRouter(object):
    def db_for_read(self, model, **hints):
        """
        Reads go to a randomly-chosen slave.
        """
        return random.choice(['slave1', 'slave2'])

    def db_for_write(self, model, **hints):
        """
        Writes always go to master.
        """
        return 'master'

    def allow_relation(self, obj1, obj2, **hints):
        """
        Relations between objects are allowed if both objects are
        in the master/slave pool.
        """
        db_list = ('master', 'slave1', 'slave2')
        if obj1._state.db in db_list and obj2._state.db in db_list:
            return True
        return None

    def allow_migrate(self, db, model):
        """
        All non-auth models end up in this pool.
        """
        return True
最后,在设置文件中,我们添加以下内容(将path.to.替换为定义路由器的模块的实际python路径):


如果不在代码中使用('default')
,似乎无法做到这一点。

是的,我已经正确设置了路由器。我会更新我的问题,这样说。
DATABASE_ROUTERS = ['path.to.AuthRouter', 'path.to.MasterSlaveRouter']