Как использовать модели Django за пределами Django? - PullRequest
1 голос
/ 19 марта 2019

Следуя этому руководству, я могу использовать модели вне Django со следующей файловой структурой, вызывая python main.py.

├── data
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   └── models.py
├── main.py
├── manage.py
└── settings.py

где main.py выглядит так:

import os, django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings')

django.setup()
from data.models import Foo, Bar #...

print(Foo.objects.all()) #this works fine

Что я хочу сделать, это превратить это в «пакет» с именем db, который выглядит следующим образом:

    ├── data
    │   ├── __init__.py
    │   ├── migrations
    │   │   └── __init__.py
    │   └── models.py
    ├── __init__.py 
    ├── manage.py
    └── settings.py

И в __init__.py пакета db я хочу сделать это:

import os, django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings')

django.setup()
from data.models import Foo, Bar # ...
from django.db import connection

__all__ = [
    'connection',
    'Foo',
    'Bar', 
    #...
]

Таким образом, я могу вызвать пакет db из test.py (который находится в том же каталоге, что и db) следующим образом:

import db

print(db.Foo.objects.all()) #this throws an error "no module named data"

или как это:

from db import Foo

print(Foo.objects.all()) # this throws an error "no module named settings"

Есть ли способ использовать модели Джанго без необходимости звонить: os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings') django.setup()

на каждой странице, которая использует модель?

Что мне здесь не хватает?

1 Ответ

0 голосов
/ 19 марта 2019

Если вы посмотрите, как загружаются приложения Django Я думаю, вам нужно запустить настройку в models.py или models/init.py вашего приложения, а не в db/__init__.py

Когда запускается Django, django.setup () отвечает за заполнение реестр приложений.

setup (set_prefix = True) Конфигурирует Django с помощью:

Загрузка настроек. Настройка ведения журнала. Если set_prefix - True, установка префикса сценария преобразователя URL-адресов на FORCE_SCRIPT_NAME, если определяется или / иным образом. Инициализация реестра приложений. это функция вызывается автоматически:

При запуске HTTP-сервера через поддержку WSGI в Django. При вызове команда управления. Он должен быть вызван явно в других случаях, для экземпляр в простых скриптах Python.

Реестр приложений инициализируется в три этапа. На каждом Django обрабатывает все приложения в порядке INSTALLED_APPS.

Сначала Django импортирует каждый элемент в INSTALLED_APPS.

Если это класс конфигурации приложения, Django импортирует root пакет приложения, определяемый его атрибутом name. Если это Пакет Python, Django создает конфигурацию приложения по умолчанию.

На данном этапе ваш код не должен импортировать никакие модели!

Другими словами, корневые пакеты ваших приложений и модули, которые определить классы конфигурации вашего приложения не должны импортировать какие-либо модели даже косвенно.

Строго говоря, Django позволяет импортировать модели сразу после их загружена конфигурация приложения. Однако во избежание ненужные ограничения порядка INSTALLED_APPS, это сильно на этом этапе не рекомендуется импортировать какие-либо модели.

По завершении этого этапа API, работающие с приложением конфигурации, такие как get_app_config (), становятся пригодными для использования.

Затем Django пытается импортировать подмодуль модели каждого приложение, если оно есть.

Вы должны определить или импортировать все модели в вашем файле models.py или модели / __ init__.py. В противном случае реестр приложения может не полностью заселены, что может привести к тому, что ORM неисправность.

По завершении этого этапа API, работающие с такими моделями, как get_model () станет доступным для использования.

Наконец, Django запускает метод ready () каждого приложения конфигурации.

...