2010-01-22 5 views
2

이것이 더 장고보다 파이썬 질문이라고 생각합니다.ImportError : 모델 A 참조 모델 B, 모델 B 참조 모델 A

하지만 기본적으로 내가 모델 (A)에서하고 있어요 :

from myproject.modelb.models import ModelB 

와 모델 B에서

:

from myproject.modela.models import ModelA 

결과 :

cannot import name ModelA

것은 내가 금지 된 일을하고 있습니까? 감사합니다.

+1

dupe http://stackoverflow.com/questions/744373/python-cyclic-imports –

+0

내 문제에 대한 답변을 찾을 수 없습니다. 추가 도움이 필요합니까? 내가 할 수있는 일이 아닌가? – Clash

답변

6

파이썬 모듈은 새로운 네임 스페이스에서 위에서 아래로 실행하여 가져옵니다. 모듈 A가 모듈 B를 가져 오면 모듈 B가로드 될 때까지 A.py의 평가가 일시 중지됩니다. 그런 다음 모듈 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') 
+0

토마스에게 감사드립니다. 나의 날을 구했다! 그건 그렇고,'a = models.ForeignKey ('ModelA')의 문법은'models.ForeignKey ('module.model')'이라고 생각합니다. 그것이 저에게 효과적입니다! – Clash

2

상호 수입은 일반적으로 잘못 모델을 설계했습니다 의미한다.

A는 B에 따라

, 당신은 B도 두 부분으로 A에

브레이크 B를 따라가 없어야합니다.

B1은 - A.

B2에 따라 - A.

A는 B1에 따라

에 의존하지 않는다. B1은 B2에 달려 있습니다. 원을 제거했습니다.

+0

답변 해 주셔서 감사합니다! 하나의 프로젝트에서 최대 한 사람이 참여하고 프로젝트의 리더는 단 한 사람입니다. 당신은 어떻게 그 순환 성을 제거합니까? 사람이 프로젝트를 참조합니다. 프로젝트는 그것의 리더 (사람)를 참조한다. – Clash

+0

@Clash : 다 대다 관계는 양측이 명시 적으로 다른 것을 참조 할 것을 요구하지 않는다. 이 중 하나만 수행하면됩니다. 과. 왜 그들은 별도의 모듈에 있습니까? –

+0

S. Lott, 다 대 다 관계가 아니며 한 사람이 한 프로젝트에 속하고 프로젝트에 한 명의 리더가 있습니다 – Clash