Скрытие точного расположения классов и функций в приложении Django (аналогично тому, как работает __init__.py)
У меня есть приложение Django с такой иерархией:
app_name
├── __init__.py
├── directory
│ ├── one.py
│ └── two.py
├── views.py
│
...
В one.py у меня есть класс под названием One и в two.py класс под названием Two. Чтобы импортировать эти классы в другие приложения, я должен написать эти две строки:
from app_name.directory.one import One
from app_name.directory.two import Two
Но я хочу изменить его так, чтобы я мог импортировать их следующим образом:
from app_name import One, Two
В Python я мог бы просто написать это в формате __init__.py:
from app_name.directory.one import One
from app_name.directory.two import Two
И это будет работать просто отлично. Но в приложении Django это приводит к тому, что Django выдает такую ошибку:
"django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet."
В этом ответе, hspandher говорит,
Также убедитесь, что вы не импортируете модели или подобный код приложений в файлы init.py ваших приложений.
И в комментарии ,
Ну, в идеале, "init_" для того и нужен, чтобы добавлять публичные импорты модуля. Однако, в случае с приложениями Django, он также имеет тенденцию вызывать циклический импорт и преждевременный импорт моделей, поскольку файл init разбирается при импорте приложения
.
Хорошо, но как это можно сделать в Django?
Также, в качестве другого примера, я вижу, что graphene-django действительно импортирует классы в своем __init__.py файле:
Иерархия:
graphene_django
├── __init__.py
├── fields.py
├── types.py
│
...
Файл:__init__.py
from .fields import DjangoConnectionField, DjangoListField
from .types import DjangoObjectType
from graphene_django import DjangoConnectionField, DjangoObjectType
Как это работает?