gpt4 book ai didi

python - 在Django中,我可以在创建对象时指定数据库吗?

转载 作者:太空宇宙 更新时间:2023-11-03 11:48:52 26 4
gpt4 key购买 nike

看看这个 Django ORM 代码:

my_instance = MyModel()
my_instance.some_related_object = OtherModel.objects.using('other_db').get(id)

此时,在第二行,Django会抛出一个错误:

ValueError: Cannont assign "<OtherModel: ID>": instance is on database "default", value is on database "other_db"

对我来说,这没有多大意义。如果我什至没有调用,Django 如何判断 my_instance 是哪个数据库:

my_instance.save(using='some_database')

还有吗?

我猜想,在构造对象期间,Django 会自动将其分配给 default 数据库。我可以改变它吗?我可以在创建对象时通过将参数传递给其构造函数来指定数据库吗?根据文档,在创建对象时我唯一可以传递的参数是其字段的值。那么我该如何解决我的问题呢?

在 Django 1.8 有一个名为 Model.from_db ( https://docs.djangoproject.com/en/1.8/ref/models/instances/ ) 的新方法,但我使用的是早期版本的 Django,无法切换到现在更新。查看实现,它所做的就是设置两个模型的属性:

instance._state.adding = False
instance._state.db = db

那么将我的代码更改为:

my_instance = MyModel()
my_instance._state.adding = False
my_instance._state.db = 'other_db'
my_instance.some_related_object = OtherModel.objects.using('other_db').get(id)

或者因为这些标志在构造函数中使用并且必须仅在构造函数中设置,所以这样做已经太晚了?

最佳答案

您可能想查看 database routing ,从 Django 1.2 开始支持。这将使您可以为不同的模型设置多个数据库(或“路由器”)。

您可以创建一个自定义数据库路由器(一个继承自内置 object 类型的类),使用 db_for_readdb_for_write 方法返回应该用于传递给该方法的模型的数据库名称(如 DATABASES 设置中所定义)。返回 None 让 Django 自己解决。

它通常用于处理主从复制,因此您可以拥有一个独立于可写数据库的只读数据库,但同样的逻辑也适用于让您指定某些模型存在于某些数据库中。

您可能还想定义一个 allow_syncdb 方法,这样只有您希望出现在数据库 B 中的模型会出现在那里,而其他所有模型都会出现在数据库 A 中。

关于python - 在Django中,我可以在创建对象时指定数据库吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33010905/

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