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

问题描述 投票:4回答:2

查看此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_dbhttps://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将引发错误:.. 。

python django orm django-orm django-database
2个回答
1
投票

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


0
投票

Django知道每个对象来自哪个数据库,因为它在其内部属性中对此进行了注释。 QuerySet本身也存储了此信息。

© www.soinside.com 2019 - 2024. All rights reserved.