gpt4 book ai didi

python - 在 Django 中为每个模型设置数据库

转载 作者:太空狗 更新时间:2023-10-29 17:05:08 26 4
gpt4 key购买 nike

我一直在查看 django 的多数据库文档。我想将我的一些模型分解成不同的数据库。但我真的只希望这些模型始终存在于特定的数据库中。我不需要特殊的路由。并编写独特的路由器只是为了说“模型 A、B 和 C 存在于数据库 X 中,模型 D、E 和 F 始终存在于数据库 Y 中”。

有没有更简单的方法来设置这样的默认值?例如,作为模型元字段?

最佳答案

您可以通过向模型显示自定义属性轻松地做到这一点:

class A(models.Model):
_DATABASE = "X"

class B(models.Model):
_DATABASE = "Y"
...

然后你需要添加路由器。下一个将通过 _DATABASE 字段选择数据库,没有 _DATABASE 属性的模型将使用 default 数据库,并且仅允许 default 数据库存在关系:

class CustomRouter(object):

def db_for_read(self, model, **hints):
return getattr(model, "_DATABASE", "default")

def db_for_write(self, model, **hints):
return getattr(model, "_DATABASE", "default")

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

def allow_migrate(self, db, model):
"""
All non-auth models end up in this pool.
"""
return True

最后一步是在 settings.py 中指定你的路由器:

DATABASE_ROUTERS = ['path.to.class.CustomRouter']

Source


顺便说一句,如果您要在非默认数据库中处理多对多关系,则此解决方案将不起作用,因为关系模型将没有“_DATABASE”属性,在这种情况下,最好使用类似 model._meta.app_label 作为db_for_read/db_for_write 中的过滤条件

关于python - 在 Django 中为每个模型设置数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8734673/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com