2017-02-21 78 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',並且從那裏導入名字以標記它們的語義。 [python的禪宗](https://www.python.org/dev/peps/pep-0020/)及其對隱含的明確要求也不喜歡;) – schwobaseggl

回答

0

大多數Django應用程序不會收集視圖或模型到頂層模塊。作爲示例,請參閱django.contrib.auth

0

大多數Django應用程序不會收集視圖或模型到頂層模塊。使用清晰的文檔來演示如何從您的應用程序導入。包括globals()在內的黑客可能會造成比幫助更多的麻煩。

django.contrib.auth爲例。