Я сделал приложение django, которое спроектировано так, чтобы быть легко подключаемым, и имеет только 1 представление и 1 модель, о которой нужно знать, планируя использовать приложение.Выставляем модели приложения Django на уровне модуля
Для удобства я хотел бы просто сделать вид и модель доступными с уровня приложения. Таким образом, вместо:
from mything.views import MyView
from mything.models import MyModel
Вы можете вместо этого просто сделать:
from mything import MyView, MyModel
Я изменил файл __init__.py
в приложение, чтобы быть похожим на это:
from .views import MyView
from .models import MyModel
Конечно я получаю старый django.core.exceptions.AppRegistryNotReady повышен, поскольку он пытается запустить код models.py перед загрузкой приложений.
Итак, я придумал следующее обходное решение, и мне интересно, если это разумный образец для использования или нет. Сейчас в __init__.py
у меня есть:
def _expose_items():
from .views import MyView
from .models import MyModel
globals()['MyView'] = MyView
globals()['MyModel'] = MyModel
И в apps.py моего приложения:
from . import _expose_items
class MyThingConfig(AppConfig):
name = 'mything'
def ready(self):
_expose_items()
Так что теперь на самом деле, я могу напрямую импортировать вид и модель с внешней стороны. Это полезно или ужасно?
Это похоже на много кун-фу для достижения цели. большинство разработчиков django не рассматривали бы функцию. В (alomst) каждый django-приложение есть 'views' и' models', а имена импортируемых там помечены семантически. [Zen of python] (https://www.python.org/dev/peps/pep-0020/) и его призыв к объяснению по поводу импликации тоже не нравится;) – schwobaseggl