2017-02-21 7 views
1

Я сделал приложение 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() 

Так что теперь на самом деле, я могу напрямую импортировать вид и модель с внешней стороны. Это полезно или ужасно?

+2

Это похоже на много кун-фу для достижения цели. большинство разработчиков django не рассматривали бы функцию. В (alomst) каждый django-приложение есть 'views' и' models', а имена импортируемых там помечены семантически. [Zen of python] (https://www.python.org/dev/peps/pep-0020/) и его призыв к объяснению по поводу импликации тоже не нравится;) – schwobaseggl

ответ

0

Большинство приложений Django не собирают представления или модели модуля верхнего уровня. В качестве примера см. django.contrib.auth.

0

Большинство приложений Django не собирают представления или модели модуля верхнего уровня. Используйте четкую документацию, чтобы продемонстрировать, как импортировать из приложения. Взломы, в том числе globals(), вероятно, создадут больше проблем, чем помощь.

См., Например, django.contrib.auth.