2012-02-17 9 views
7

Mam modelu project_phase:modele django rekurencyjne import - jak rozwiązać

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

odwołuje pmo_review_task (bo tworzy pmo_review_task w jej uratować ovewrite)

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

który referencje sc_review_task która odwołuje się do project_phase (ponieważ tworzy fazę projektu w swoim ovewrite)

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

tak kończy to się project_phase import pmo_review_task importuje sc_review_task importuje project_phase i myślę, że pętle jakoś generuje ten błąd:

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 

jak mogę rozwiązać ten?

+0

Dlaczego te trzy modele znajdują się w oddzielnych plikach? Czy próbujesz stworzyć architekturę typu "jeden model na plik"? Czemu? –

Odpowiedz

17

dwa sposoby:

  1. importować modelu wewnątrz metody (jak sugeruje @YujiTomita).
  2. Aby skorzystać z funkcji get_modeldjango.db.models który jest przeznaczony do importu modeli leniwych .:

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

wolę tę drugą, ale obie metody są w porządku.

+0

Tak, przypuszczam, że jest to bardziej odpowiednia odpowiedź, ponieważ tytuł pytania wyraźnie wspomina o rekurencyjnym imporcie modelu django. +1 –

+0

Czy pierwsza droga jest droższa? Chodzi mi o to, że będą importowane wszystkie wywołania funkcji. – sunprophit

+0

@sunprophit Nie mogę powiedzieć, który z nich jest bardziej "drogi", ponieważ koszt jakiejkolwiek z tych metod będzie znikomy (w porównaniu do innych operacji w twoim kodzie, takich jak komunikacja z DB). Czytelność lub twój osobisty gust są tutaj ważniejszymi czynnikami. – DrTyrsa

6

import project_phase wewnątrz metody save.

Import jest wywoływany za każdym razem, gdy wykonywany jest kod.

Jeśli znajduje się w globalnej przestrzeni nazw modułów (u góry), to jest wywoływana od razu i podczas opisywania będziesz mieć problemy z okrężnymi importami, ponieważ jeden plik importuje inny plik, który importuje oryginalny plik.

Jeśli wstawisz instrukcję importu problemu do funkcji, zostanie ona/nie wywołana podczas importowania pliku.

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. 
Powiązane problemy