2010-04-29 45 views
1

我有一個將模型分割成不同文件的應用程序。在「models.py」以外聲明模型並動態地

其實該文件夾的樣子:

>myapp 
    __init__.py 
    models.py 
    >hooks 
     ... 
    ... 

myapp不關心什麼是在hooks,文件夾,除了有模型,他們必須以某種方式進口,並通過執行syncdb安裝。所以,我把這個myapp.__init__.py

from django.conf import settings 

for hook in settings.HOOKS : 
    try : 
     __import__(hook) 
    except ImportError as e : 
     print "Got import err !", e 
#where settings.HOOKS = ("myapp.hooks.a_super_hook1", ...) 

爲了使此代碼工作,在hooks的車型有

class Meta: 
    app_label="my_app" 

的問題是,當我運行syncdb它不工作。

所以,我想依次爲:

1)

for hook in settings.HOOKS : 
    try : 
     exec ("from %s import *" % hook) 

- >不工作之一:執行syncdb不hooks

2)

安裝模式
from myapp.hooks.a_super_hook1 import * 

- >這工作

3)

exec("from myapp.hooks.a_super_hook1 import *") 

- >本工程以

所以我檢查,在測試1),執行的語句是與測試相同2)3),它是完全一樣...

任何想法???

編輯: 這個問題可以被歸結爲:

我宣佈「models.py」,其中把我進口碼外模式,讓syncdb找到的模式?

回答

0

好的...我有這該死的東西。

導入模型時,syncdb會嘗試導入找到的內容。如果導入失敗,那麼後期的將在稍後嘗試!這就是爲什麼:

for hook in settings.HOOKS : 
    try : 
     __import__(hook) 
    except ImportError as e : 
     print "Got import err !", e 

不執行syncdb工作:因爲進口捕獲錯誤時,並沒有傳遞,那麼模型導入決不會後poned。所以,正確的代碼要做到這一點很簡單:

for log_hook in settings.LOG_HOOKS : 
    try : 
     __import__(log_hook) 
    except ImportError as e : 
     raise e 

try... except在這種情況下可能沒用。

-1

假設你有一個名爲users_models.pyhooks文件夾文件:

可以說在myapp.__init__.pyfrom hooks.users_models import *?那肯定會收到syncdb

+0

不知道爲什麼這被低估。你能提供一個理由嗎? – 2010-04-29 14:54:58

+0

是的!這絕對是由syncdb選擇的(請參見示例2和3)......但這意味着我必須對要導入的模塊進行硬編碼!而我不想。 但無論如何......爲什麼地獄的第一塊代碼不起作用?這實際上是我的問題! PS:我不知道你爲什麼被低票,因爲你是最能理解我的問題的人。 – sebpiq 2010-04-30 06:46:00

+0

可能是導入(第一種情況)會起作用,但是這不會使syncdb安裝所需的模型,因爲它(syncdb)將始終取決於'installed_apps'設置,並且將僅根據。這就是爲什麼這些模型以'間接的方式''apped'到app/models.py(syncdb始終感興趣) – 2010-04-30 07:45:52

1

Django知道在您的項目中任何位置定義的所有模型,因此您只需確保它們定義的代碼得到執行。這通常在您導入定義模型的模塊時發生。

這是需要了解的重要的另一件事是需要被設置爲你的應用程序(在你的例子myapp)的包名Meta類的你的模型內app_label屬性。這是必要的,因爲syncdb只會從您的INSTALLED_APPS設置中列出的應用程序安裝數據庫中的模型。

關於在你的問題說明你的設置,你需要:

  1. 確保在模型中定義的模塊被進口
  2. 設定模型的Metaapp_label屬性myapp
  3. myapp到您的INSTALLED_APPS設置

附加信息: Django中的另一個要求是讓syncdb在您的模型上工作,即定義模型的應用程序(其中app_label設置爲)需要models.py文件,即使該文件爲空。但正如你的問題所述,你已經擁有這個文件。

+0

感謝您的回答Gregor,我已經知道這一點...我的'app_label'屬性已經設置,並且一切工作正常,如果導入成功。 實際上,在將進口代碼放入__init__模塊之前,他們在我的settings.py(在文件的末尾)以及evrything運行良好的地方。但它很醜,所以我想把它們放入關聯的應用程序中。所以我的問題有點不同! – sebpiq 2010-04-30 06:38:40