看看这个 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_read
和 db_for_write
方法返回应该用于传递给该方法的模型的数据库名称(如 DATABASES
设置中所定义)。返回 None
让 Django 自己解决。
它通常用于处理主从复制,因此您可以拥有一个独立于可写数据库的只读数据库,但同样的逻辑也适用于让您指定某些模型存在于某些数据库中。
您可能还想定义一个 allow_syncdb
方法,这样只有您希望出现在数据库 B 中的模型会出现在那里,而其他所有模型都会出现在数据库 A 中。
关于python - 在Django中,我可以在创建对象时指定数据库吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33010905/