2012-02-17 68 views
7

我有一個模型project_phaseDjango模型遞歸進口 - 如何解決

from django.db import models 
    from django.utils import simplejson 
    from core.models import pmo_review_task 

它引用pmo_review_task(因爲它創建一個pmo_review_task其保存ovewrite)

from django.db import models 
from datetime import datetime 
from django.contrib.auth.models import User 
from core.models import sc_review_task 

這引用sc_review_task引用project_phase(因爲它在保存ovewrite中創建了project_phase)

from django.db import models 
from core.models import project_phase 

所以它最終project_phase進口pmo_review_task進口sc_review_task進口project_phase,我想它循環某種程度上產生這個錯誤:

Unhandled exception in thread started by <bound method Command.inner_run of <django.core.management.commands.runserver.Command object at 0x010ACFB0>> 
Traceback (most recent call last): 
    File "C:\Python27\lib\site-packages\django\core\management\commands\runserver.py", line 88, in inner_run 
    self.validate(display_num_errors=True) 
    File "C:\Python27\lib\site-packages\django\core\management\base.py", line 249, in validate 
    num_errors = get_validation_errors(s, app) 
    File "C:\Python27\lib\site-packages\django\core\management\validation.py", line 35, in get_validation_errors 
    for (app_name, error) in get_app_errors().items(): 
    File "C:\Python27\lib\site-packages\django\db\models\loading.py", line 146, in get_app_errors 
    self._populate() 
    File "C:\Python27\lib\site-packages\django\db\models\loading.py", line 64, in _populate 
    self.load_app(app_name) 
    File "C:\Python27\lib\site-packages\django\db\models\loading.py", line 78, in load_app 
    models = import_module('.models', app_name) 
    File "C:\Python27\lib\site-packages\django\utils\importlib.py", line 35, in import_module 
    __import__(name) 
    File "C:\work\Portman\core\models\__init__.py", line 4, in <module> 
    from pmo_review_task import pmo_review_task 
    File "C:\work\Portman\core\models\pmo_review_task.py", line 5, in <module> 
    from core.models import sc_review_task 
    File "C:\work\Portman\core\models\sc_review_task.py", line 3, in <module> 
    from core.models import project_phase 
    File "C:\work\Portman\core\models\project_phase.py", line 4, in <module> 
    from core.models import pmo_review_task 
ImportError: cannot import name pmo_review_task 

我怎麼克服呢?

+0

爲什麼這三種模式在單獨的文件?你是否試圖建立一種「每個文件模式」的架構?爲什麼? – 2012-02-17 10:55:08

回答

17

兩種方式:

  1. 要導入的方法中的模型(如@YujiTomita建議)。
  2. 要使用get_model功能從django.db.models這是專爲懶人模式:進口

    project_phase = get_model('core', 'project_phase') 
    

我更喜歡第二個,但是這兩種方法都OK。

+0

是的,我想這是更合適的答案,因爲問題標題特別提到了django模型遞歸導入。 +1 – 2012-02-17 07:57:34

+0

第一種方式比較貴嗎?我的意思是每個函數調用都會導入。 – sunprophit 2013-11-08 14:05:06

+0

@sunprophit我不能說哪個人,如果更「昂貴」,因爲任何這些方法的成本可以忽略不計(比較其他操作在你的代碼像DB通信)。可讀性或您的個人品味在這裏是更有價值的因素。 – DrTyrsa 2013-11-08 21:29:20

6

進口project_phasesave方法。

執行代碼時會調用導入。

如果它在全球模塊命名空間(頂部),那麼它馬上打來電話,你描述,因爲一個文件導入其中進口原始文件的另一個文件你就會有圓形的進口問題。

如果你把這個問題import語句的功能裏面,它是/不是/呼籲導入文件。

import foo # executed upon importing this file. 

def import_foo_when_called(): 
    import foo # only executed when function is called, thus no problems when 
       # another module imports this file.