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

标签 python django orm django-orm django-database

看看这个 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/

相关文章:

python - 反向树构建(有奇数个 child )

Python Pandas Dataframe 存储下一行值

python - 在二进制补码表示中格式化负整数

django - Django View 的命名约定?

java - 本地 H2 服务器 + hibernate : existing database is not visible

java - Hibernate 5.0.0.CR2 中未启用 getGenerateKeys() 支持错误

python - Numpy bool 掩码——多维和 float

python - Django:我什么时候需要 __eq__ 方法?

Django : login() within Sign In form clean() or in the view ?

ruby-on-rails - rails has_many :through has_many :through