如何在Django中获取模型实例保存到的数据库?

时间:2012-03-29 16:37:16

标签: python django multiple-databases

我有一个使用多个数据库的django应用程序。给定一个模型的实例,我如何获得存储它的数据库(如果有的话)?我需要这个将另一个对象保存到与第一个相同的数据库。

def add_ducks_to_hunt(hunter):
    db = # the hunter's db
    duck = Duck()
    duck.save(using=db)

5 个答案:

答案 0 :(得分:4)

使用_state.db,如:

my_obj = MyModel.objects.get(pk=1)
my_obj._state.db

这显示在routing example

答案 1 :(得分:0)

我相信您正在项目(顶级)Django目录中寻找settings.py。如果没有,你会发布更多信息吗?

这是我在Django项目目录/ home / amr / django / amr中的一些settings.py文件。

import os
DEBUG = True
TEMPLATE_DEBUG = DEBUG

ADMINS = (
    # ('Somone R. Somebody'so-forath-and-so-and-so@somewhere.com'),
)

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

答案 2 :(得分:0)

没有办法直接从模型实例本身获取信息。啊,_state,是的。你应该明确传入'using'参数,就像那些内置方法一样。或者通过检查模型实例的一些事实来设计可以推断出要使用的数据库的路由器,这里是猎人。

答案 3 :(得分:0)

如果始终将模型保存在同一个数据库中,则可以将该信息存储在模型类中,然后在需要时使用它。可能不是非常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名称写入某个表的某个地方之外,您始终可以访问它并使用其他方式。加载对象的信息。

答案 4 :(得分:0)

假设您有多个数据库,并且已经定义了router,则只需查询路由器即可:

from myrouters import MyRouter
from myapp.models import Duck
using = MyRouter().db_for_write(Duck)
duck = Duck()
duck.save(using=using)

也就是说,我不确定为什么需要这样做。如果模型存在于一个数据库中,并且您已经正确定义了路由器,则应该没有必要。 Django将自动为using查找正确的默认值。如果该模型同时存在于多个数据库中,并且希望控制要写入的特定数据库,那么您应该已经知道要使用哪个数据库,而不必查询它。