我有一个使用多个数据库的django应用程序。给定一个模型的实例,我如何获得它存储的数据库(如果有的话)?我需要这个来保存另一个对象到 一样 数据库作为第一个数据库。
def add_ducks_to_hunt(hunter):
db = # the hunter's db
duck = Duck()
duck.save(using=db)
我相信你正在寻找项目(顶层)目录下的settings.py。如果不是的话,你能不能发布更多信息?
下面是我在Django项目目录homeamrdjangoamr中的settings.py文件的一部分。
import os
DEBUG = True
TEMPLATE_DEBUG = DEBUG
ADMINS = (
# ('Somone R. Somebody'[email protected]'),
)
MANAGERS = ADMINS
DATABASES = {
'default': {
#'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
'ENGINE': 'mysql',
'NAME': 'some-server-name', # Or path to database file if using sqlite3.
'USER': '<user>', # Not used with sqlite3.
'PASSWORD': 'xxxxxxxx', # Not used with sqlite3.
'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
'PORT': '', # Set to empty string for default. Not used with sqlite3.
}
}
SESSION_COOKIE_AGE = 15 * 60 * 60 # Age of cookie, in seconds
如果你总是把模型保存在同一个db中,你可以把这些信息存储在model类中,然后在需要的时候使用它。可能不是很pythonic,但可能会有效果。
Class Hunter(models.Model):
# ... other stuff
db = 'hunter_db'
然后用 __class__
:
def add_ducks_to_hunt(hunter):
db = hunter.__class__.db
duck = Duck()
duck.save(using=db)
另一方面,如果你把一个类的对象保存在不同的数据库中,除了在对象的save()中把每个对象的id和db名写到某个你可以随时访问的表中,然后用这些信息来加载对象之外,我看不到其他的方法。
假设你有多个数据库,并且你已经定义了一个叫做 "database "的类,那么你就可以把这个类的id和db名写到某个表中,以便你可以随时访问它,并使用这些信息来加载这个对象。路由器那你就可以像查询路由器一样查询。
from myrouters import MyRouter
from myapp.models import Duck
using = MyRouter().db_for_write(Duck)
duck = Duck()
duck.save(using=using)
也就是说,我不知道你为什么要这样做。如果模型存在于一个数据库中,并且你已经正确定义了一个路由器,那么这应该是不必要的。Django会自动查找正确的缺省值,如 using
. 如果模型同时存在于多个数据库上,想要控制模型写入的具体数据库,那么你应该已经知道要使用哪个数据库,应该不需要查询。
没有办法直接从模型实例本身获取信息。 啊,_state,是的,它的 你应该显式地传入'using'参数,就像那些内置方法一样。或者设计一个路由器,它可以通过检查模型实例的一些事实来推断出要使用的DB,这里是猎人。