有没有办法指定一个模型(甚至是应用程序)应该只使用一个特定的数据库?
我正在使用一个我不想更改的遗留数据库。我有两个数据库-‘默认’是一个sqlite的,可用于管理等,和遗留的一个。我使用inspectdb为遗留数据库(部分)创建了一个模型,它有managed = False
。但是,有没有办法在模型本身中指定它只适用于特定的数据库?
我看到您可以在一些查询集等中使用specify using=databasename
,但这对Databrowse (也可能是通用视图?)这样的东西并不好。Databrowse的缺点可能是你不能指定数据库,但它似乎是指定它是模型的正确地方……
然后我想,也许答案是编写一个自定义的model manager,它只引用我的遗留数据库-但文档中没有提到任何类似的内容。
对于如何使用多个数据库,我是否有一个与Django世界不同的心理模型?
发布于 2010-08-19 15:56:35
据我所知,你不能直接用模型指定数据库,因为这会阻止应用程序的重用,但从我在文档中看到的情况来看:
发布于 2017-12-20 06:20:46
您不能为模型指定数据库,但可以在自定义DB路由器类中定义它。
# app/models.py
class SomeModel(models.Model):
...
# app/dbrouters.py
from app.models import SomeModel
...
class MyDBRouter(object):
def db_for_read(self, model, **hints):
""" reading SomeModel from otherdb """
if model == SomeModel:
return 'otherdb'
return None
def db_for_write(self, model, **hints):
""" writing SomeModel to otherdb """
if model == SomeModel:
return 'otherdb'
return None
# app/settings.py
DATABASE_ROUTERS = ('app.dbrouters.MyDBRouter',)
...
DATABASES = {
...
'otherdb': {
....
}
}
发布于 2020-01-13 23:20:04
简单的解决方案是将管理器设置为始终使用模型的特定数据库。看看姜戈的using
吧。
示例:
class User(models.Model):
birth_date = models.DateField()
class Meta:
managed = False
db_table = 'myotherapp_user'
User.objects = User.objects.using('myotherdb')
然后,您可以使用User.objects
,它将始终使用'myotherdb'
数据库,而不是'default'
。
请注意,来自不同数据库的模型之间的关系将不起作用,但这是Django的一个问题,因为它不支持开箱即用。
https://stackoverflow.com/questions/3519143
复制相似问题