Как использовать django orm в не django -проекте? - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть проект с такой структурой:

.
├── app
│   ├── data
│   │   ├── ...
│   │   └── orm
│   │       ├── app_1
│   │       ├── app_2
│   │       ├── ...
│   │       └── orm
│   │           ├── ...
│   │           └── settings.py
│   └── ...
├── ...
└── main.py

Я хочу использовать django orm в своем проекте, но я хочу иметь простой способ изменить Django ORM на любой другой ORM. Соответственно, я хочу изолировать django проект внутри моего основного проекта.

У меня есть класс app.data...DataController, который использует модели в любых случаях. И код в main.py использует DataController для получения или загрузки данных из БД, другой код работает уже с данными, но не с моделями напрямую.

Для достижения этого я написал этот код в app.data.__init__.py:

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.data.orm.orm.settings")

import django

from django.conf import settings

django.setup()

Также, если я вставлю этот код куда-нибудь еще, например, в main.py, это не работает, django говорит ImproperlyConfigured: Requested setting INSTALLED_APPS.

А потом в settings.py я был измените пунктирные пути на подобные приложения 'app_1' -> 'app.data.orm.app_1'. Но сейчас я не могу использовать django -команды из manage.py не из каталога root проекта или из app/data/orm. Во-первых, каталог проекта root отсутствует в sys.path, во-вторых, если я добавлю его, я получу RuntimeError: populate() isn't reentrant исключение.

Есть ли способ сделать то, что я хочу или чего мне не хватает?


обн.

Хорошо, я сделал так, как я описал в начале, но выглядит ужасно - я переместил manage.py в проект root, код с django.setup () лежит где-то в середине проекта Мне пришлось его отредактировать manage.py, таким образом os.environ.setdefault ('DJANGO_SETTINGS_MODULE', 'app.data.orm.orm.settings').

Есть ли более красивый способ организовать проект, в котором вам нужно использовать стороннюю Django ORM?

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