django моделирует рекурсивный импорт - как решить - PullRequest
8 голосов
/ 17 февраля 2012

У меня есть модель project_phase :

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

, на которую она ссылается pmo_review_task (потому что она создает 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 (потому что он создает project_phase в своем файле сохранения)

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

, поэтому он заканчивается project_phase import 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

как мне преодолеть это?

Ответы [ 3 ]

19 голосов
/ 17 февраля 2012

Два способа:

  1. Чтобы импортировать модель внутри метода (как предложено @YujiTomita).
  2. Для использования функции get_model из django.db.models, которая предназначена для импорта ленивых моделей .:

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

Я предпочитаю второй, но оба метода в порядке.

7 голосов
/ 17 февраля 2012

импорт project_phase внутри метода save.

Импорт вызывается всякий раз, когда выполняется код.

Если он находится в глобальном пространстве имен модуля (вверху), то он вызывается сразу, и у вас возникнут проблемы кругового импорта, как вы описываете, потому что один файл импортирует другой файл, который импортирует исходный файл.

Если вы помещаете оператор импорта проблемы в функцию, он / не / вызывается при импорте файла.

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.
2 голосов
/ 14 марта 2018

Django 1.9 и выше

Как get_model() в django.db.models был удален в 1.9.

Использование django.apps.get_model()

Аналогичный вопрос: Что эквивалентно django.db.models.loading.get_model () в Django 1.9?

или используйте метку приложения в кавычках, если вы просто используете ее для создания чужого ключа.

Вместо from core.models import project_phase do

models.ForeignKey("core.project_phase")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...