查看此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)
或者为时已晚,因为这些标志在构造函数中使用并且仅在构造函数中设置?
查看此Django ORM代码:my_instance = MyModel()my_instance.some_related_object = OtherModel.objects.using('other_db')。get(id)此时,在第二行中,Django将引发错误:.. 。
[您可能想研究database routing,自Django 1.2开始支持。这将使您可以为不同的模型设置多个数据库(或“路由器”)。
Django知道每个对象来自哪个数据库,因为它在其内部属性中对此进行了注释。 QuerySet本身也存储了此信息。