Используя только часть БД Django - PullRequest
40 голосов
/ 24 февраля 2009

Кто-нибудь знает, насколько "модульным" является Django? Могу ли я использовать только часть ORM, чтобы получить классы, которые сопоставляются с таблицами БД, и знать, как читать / писать из этих таблиц?

Если нет, то что бы вы порекомендовали как "Python-эквивалент Hibernate"?

Ответы [ 14 ]

1 голос
/ 19 февраля 2016
import django
from django.conf import settings
from backend_mock.admin import settings as s
settings.configure(
    DATABASES=s.DATABASES,
    INSTALLED_APPS=('backend_mock.admin.mocker', )
)
django.setup()

посмотрите на это, оно работает для django версии gte 1.8.x

1 голос
/ 19 октября 2015

Возможно, я уже опоздал с ответом, но лучше поздно, чем никогда.

Попробуйте этот простой пакет: https://github.com/serglopatin/django-models-standalone

Как использовать:

  1. скачать

  2. установка

    python setup.py install
    
  3. создать проект

    django-models-standalone startproject myproject
    
  4. настроить файлы settings.py (DATABASES) и models.py, а затем выполнить миграцию, если таблицы не созданы

  5. использовать модели djando в вашем приложении (example.py)

0 голосов
/ 23 мая 2018

Вы можете использовать его вне проекта django. Но есть вещи, о которых вы должны знать.

1. Маршрутизатор с несколькими базами данных.

Маршрутизатор выглядит так:

class Router(object):
    app_label = ''

    def db_for_read(self, model, **hints):
        if model._meta.app_label == self.app_label:
            return self.app_label
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label == self.app_label:
            return self.app_label
        return None

    def allow_relation(self, obj1, obj2, **hints):
        if obj1._meta.app_label == self.app_label or obj2._meta.app_label == self.app_label:
           return True
        return None

    def allow_migrate(self, db, app_label, model=None, **hints):
        if app_label == self.app_label:
            return db == self.app_label
    return None

Вы можете использовать метакласс для динамического создания маршрутизатора.

def add_db(db_conf):
    app_label = 'al_' + str(uuid4())

    settings.DATABASES[app_label] = db_conf

    router_class_name = 'Router' + app_label.capitalize()
    setattr(
        settings,
        router_class_name,
        type(router_class_name, (Router,), dict(app_label=app_label)),
    )
    settings.DATABASE_ROUTERS.append(
        '.'.join([settings.__name__, router_class_name])
    )
    connections.close_all()
return app_label

2. Настройки Django.

самый важный ключ - TIME_ZONE. DatetimeField и DateField высвобождается к нему. Простейшая настройка должна быть:

SECRET_KEY = 'secret'
DATABASES = {'default': {}}
DATABASE_ROUTERS = []
TIME_ZONE = None

3. close_old_connections.

Фреймворк Django по умолчанию запускает close_old_connections в каждом промежуточном программном обеспечении запроса, чтобы избежать " mysql пропал ".


PS : Я написал пакет для использования django orm, а не в классическом проекте django, https://github.com/jdxin0/django_db(https://github.com/jdxin0/django_db). Но вы всегда должны обращать внимание на три вышеуказанные проблемы. Мой пакет использует метакласс для решения multi db, установите TIME_ZONE=None и оставьте close_old_connections для пользователя.

0 голосов
/ 27 марта 2018

Могу ли я использовать только часть ORM, чтобы получить классы, которые сопоставляются с таблицами БД, и знать, как читать / писать из этих таблиц?

Да, вы можете.

Вот чистое и краткое объяснение того, как использовать модели Django и абстракцию базы данных : https://stackoverflow.com/a/49515366/2682613

Версия Django: 2.0.2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...