Django:独立于app的多个读写数据库

时间:2017-09-18 06:16:07

标签: django django-orm multiple-databases django-database

我们如何在Django上使用多个数据库,在某些特定条件下,例如,

1.一个DB仅用于写入(db_for_write.sqlite3
2.另外两个用于阅读的数据库(read_replica_1.sqlite3read_replica_2.sqlite3
3.所有这些3 DB应始终同步(3 DB应始终包含相同的数据)
4. CRUDmigration等所有操作均独立于appmodel

这是我的 Db_Router.py

import random


class ExampleDatabaseRouter(object):
    def db_for_read(self, model, **hints):
        db_list = ('db_for_read_1', 'db_for_read_2')
        return random.choice(db_list)

    def db_for_write(self, model, **hints):
        return 'db_for_write_only'

    def allow_relation(self, obj1, obj2, **hints):
        # I couldn't understand what would do this method
        return

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        # sync all DB
        return

不幸的是,我无法理解allow_relation()方法的目的。我希望有人可以帮助我。

1 个答案:

答案 0 :(得分:1)

来自documentation

  

allow_relation(obj1,obj2,**提示)¶

     

如果应允许obj1和obj2之间的关系,则返回 True ;如果应该阻止关系,则返回False;如果路由器没有意见,则返回None。 这纯粹是一种验证操作,由外键和多对多操作用于确定两个对象之间是否应该允许关系。

与文档中一样,此方法仅确定传入其中的对象是否有资格在它们之间创建关系。当使用多个数据库时,可能会出现这样的情况,即来自不同数据库的表需要它们之间的关系,但Django目前不支持这种关系,通常称为cross-database relationships。这是因为参照完整性。为了维护两个对象之间的关系,Django需要知道相关对象的主键是有效的。如果主键存储在单独的数据库中,则无法轻松评估主键的有效性。

如果您需要更多地了解跨数据库关系,那么django文档提供了更好的explanation

实际上,Django文档几乎涵盖了有关路由器的所有内容。一个非常基本的例子还包括here

相关问题