ImportError: модель A ссылается на модель B, модель B ссылается на модель A - PullRequest
2 голосов
/ 22 января 2010

Я думаю, что это больше вопрос о питоне, чем Джанго.

Но в основном я делаю в модели A:

from myproject.modelb.models import ModelB

и в модели B:

from myproject.modela.models import ModelA

Результат:

не может импортировать имя ModelA

Я делаю что-то запрещенное? Спасибо

Ответы [ 2 ]

6 голосов
/ 22 января 2010

Модуль Python импортируется путем его выполнения сверху вниз в новом пространстве имен. Когда модуль A импортирует модуль B, оценка A.py приостанавливается до загрузки модуля B. Когда модуль B затем импортирует модуль A, он получает частично инициализированное пространство имен модуля A - в вашем случае ему не хватает класса ModelA, поскольку импорт myproject.modelb.models происходит до определения этого класса.

В Django вы можете исправить это, ссылаясь на модель по имени, а не по объекту класса. Таким образом, вместо того, чтобы сказать

from myproject.modela.models import ModelA
class ModelB:
    a = models.ForeignKey(ModelA)

вы бы использовали (без импорта):

class ModelB:
    a = models.ForeignKey('ModelA')
2 голосов
/ 22 января 2010

Взаимный импорт обычно означает, что вы создали свои модели неправильно.

Когда A зависит от B, у вас не должно быть B также в зависимости от A.

Разбить B на две части.

B1 - зависит от A.

B2 - не зависит от A.

A зависит от B1. B1 зависит от B2. Округлость удалена.

...