Структура директории остального Django - PullRequest
0 голосов
/ 25 мая 2018

Я новичок в инфраструктурах отдыха Django и использую их для одного из наших проектов. Моя текущая структура каталогов выглядит как

project
     app
        __init__.py
        migrations
        utils
            __init__.py
            helpers.py
            utils.py
        core
            datastructures.py
        apps.py
        models.py
        serializers.py
        views.py
     project
        __init__.py
        settings.py
        urls.py
        wsgi.py
     manage.py

Вышеуказанный каталог utils содержит пользовательский код для доступа и изменения базы данных, поэтомуНужно использовать модели в models.py.

В директории core содержится логика приложения, которая будет использовать функции, определенные в utils.py и helpers.py.

Так что мне нужно импортировать файлиз родительского каталога в helpers.py. Я пытаюсь сделать это следующим образом -

    from ..models import model1,model2.....

Ожидается, что это дает классическую ошибку импорта в Python 3, как ImportError: attempted relative import with no known parent package

Я также пытался -

     from project.app.models import model1,model2,...

это также выдает ошибку -

   django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

Учитывая все вышеизложенное (утилиты должны использовать модели, а ядро ​​должно использовать утилиты), я чувствую, что я в полном беспорядке!

Какова соответствующая структура каталогов, которой я должен следовать? И как будет работать этот импорт?

Ответы [ 3 ]

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

Вы зарегистрировали приложение в своем INSTALLED_APPS?Это должно быть доступно в вашем settings.py.

Из документации Django

apps.py

from rock_n_roll.apps import RockNRollConfig

class JazzManoucheConfig(RockNRollConfig):
    verbose_name = "Jazz Manouche"

settings.py

INSTALLED_APPS = [
    'anthology.apps.JazzManoucheConfig',
    # ...
]
0 голосов
/ 25 мая 2018

Один из способов обойти потребность утилит в моделях - использовать apps.get_model.

from django.apps import apps

my_model = apps.get_model(app_label='app', model_name='MyModel')
0 голосов
/ 25 мая 2018

Второй подход с from project.app.models import model1,model2,... правильный.Но импорт не должен быть на уровне модуля.

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

...