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

问题描述 投票:1回答:5

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

def add_ducks_to_hunt(hunter):
    db = # the hunter's db
    duck = Duck()
    duck.save(using=db)
python django multiple-databases
5个回答
5
投票

使用 _state.db,如。

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

这显示在... 路由示例.


0
投票

我相信你正在寻找项目(顶层)目录下的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

0
投票

如果你总是把模型保存在同一个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名写到某个你可以随时访问的表中,然后用这些信息来加载对象之外,我看不到其他的方法。


0
投票

假设你有多个数据库,并且你已经定义了一个叫做 "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. 如果模型同时存在于多个数据库上,想要控制模型写入的具体数据库,那么你应该已经知道要使用哪个数据库,应该不需要查询。


-1
投票

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

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