Как получить базу данных, в которой был сохранен экземпляр модели в Django? - PullRequest
1 голос
/ 29 марта 2012

У меня есть приложение django, использующее несколько баз данных.Учитывая экземпляр модели, как я могу получить базу данных, где она хранится (если есть)?Мне нужно это, чтобы сохранить другой объект в той же базе данных, что и первый.

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

Ответы [ 4 ]

4 голосов
/ 30 марта 2012

Используйте _state.db, как в:

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

Это показано в примере маршрутизации .

0 голосов
/ 29 марта 2012

Нет способа напрямую получить информацию от самого экземпляра модели. Ах, _state, да.Вы должны явно передать параметр 'using', точно так же, как эти встроенные методы.Или разработайте маршрутизатор, который мог бы вывести БД для использования, проверив некоторые факты экземпляра модели, здесь охотник.

0 голосов
/ 30 марта 2012

Если вы всегда сохраняете модель в одной и той же базе данных, вы можете сохранить эту информацию в классе модели, а затем использовать ее при необходимости. Вероятно, не очень питонический, но это может помочь.

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 () объекта в таблицу, где вы всегда можете получить к ней доступ и использовать эта информация для загрузки объекта.

0 голосов
/ 29 марта 2012

Полагаю, вы ищете файл settings.py в каталоге проекта (верхнего уровня) Django. Если нет, вы бы опубликовали больше информации?

Вот немного моего файла settings.py в каталоге проекта Django / home / amr / django / amr.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...