2012-02-17 5 views
7

を解決するには:(それはそのovewriteセーブでpmo_review_taskを作成するため)、それはpmo_review_taskを参照Djangoのモデル再帰的な輸入を - 私はモデル<strong>project_phase</strong>持っているか

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

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を参照しています(save_writeに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

これらの3つのモデルが別々のファイルであるのはなぜですか? 「ファイルごとに1つのモデル」の種類のアーキテクチャを使用しようとしていますか?どうして? –

答えて

17

二つの方法:

  1. メソッド内モデルをインポートする(@YujiTomitaが示唆したように)。
  2. 遅延モデルの輸入のために設計されてdjango.db.modelsからget_model関数:

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

を使用する私は、第二のものを好むが、両方の方法がOKです。

+0

はい、私はこれがもっと適切な答えだと思うので、質問タイトルは特にdjangoモデルの再帰的なインポートについて言及しています。 +1 –

+0

最初の方法はより高価ですか?私はすべての関数呼び出しをインポートすることを意味します。 – sunprophit

+0

@sunprophitこれらの方法のいずれかのコストは無視できるので(DBとの通信のようなコード内の他の操作と比較して)、より高価なものはどれかを言うことはできません。読みやすさやあなたの個人的な味は、ここでより貴重な要素です。 – DrTyrsa

6

インポートproject_phasesaveメソッド内にあります。

コードが実行されるたびにインポートが呼び出されます。

グローバルモジュールの名前空間(最上部)にある場合、すぐに呼び出されます.1つのファイルが元のファイルをインポートする別のファイルをインポートするため、記述したとおりにインポートの問題が発生します。

問題のインポートステートメントを関数内に置くと、ファイルをインポートするときに/ not/calledが呼び出されます。

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.