Model들간의 circular import dependencies 해결하기
migrate를 하려고 하니, 아래와 같은 에러가 발생하였다고 한 블로거.
위코드에서 공부하는 내내 한번도 본 적이 없는 에러가 아닌가..! 암만 생각해도 어떻게 해결해야 하는지 감이 오질 않았다.
분명 위코드에서 강조하는 convention에 따르면, 사용하고자 하는 class
들을 해당 app
마다 models.py
파일에서 import
해야한다고 했는데..!!!
그냥 import *
라고 하면 아무 문제가 발생하지 않았다. 하지만 우리는 혹시 모를 충돌을 방지하기 위해, 모든.. 클래스를 하나하나 명시해주려고 했는데...
👆🏻 이게 우리가 겪은 에러!
자꾸.. circular import
라면서 아무리 수정해도 상황이 변하지 않는 것이 아닌가.
이 상황을 벗어나기 위해서는 import *
이런식으로 작성하는 수 밖에는 없었다.
하지만 그럴리가 없쟈나..!!!
암만 난리를 쳐보아도 에러내용의 순서만 바뀔 뿐, 문제 내용은 똑같았다.
직역해보자면.. import
가 계속해서 순환하기 때문이라는 거잖아?
다른 팀원에게 SOS를 친 결과 상단의 블로그를 추천해줬고. 내가 겪는 문제는 다음과 같았다.
👉🏻 circular import dependencies 문제인 것!
Django는 settings.py 안의
INSTALLED_APPS
라는 배열에 있는app
들을 위에서부터 순서대로 정의한다고 한다.INSTALLED_APPS = [ # 생략 'users', 'posts', 'likes', ]
users => posts => likes 순서로 app을 정의하게 되는데, 이 때 posts라는 app을 정의하고 있다고 하자.
- posts/models.py에서 from likes.models import Like를 만나게 된다.
- Like를 import하기 위해서 likes/models.py로 갔더니 from posts.models import Post를 만나게 된다.
- 다시 posts/models.py로 가서.. 응?
이렇게 무한반복 중이었던 것.
어떤 app의 정의가 채끝나기도 전에 다시 해당하는 app 자신이 참조되기 때문에 발생한 문제이다. 그렇다고 서로 다른 app에서 서로의 model를 참조하는 것이 불가능한 것은 아니다.(당연히 그렇겠지..!!!!)
dJango 공식 문서! - models의 foreignKey
If you need to create a relationship on a model that has not yet been defined, you can use the name of the model, rather than the model object itself
ForeignKey
,ManyToManyField
안에model 객체
가 아닌model의 이름
을문자열
로 넣어주면 정상적으로 작동.# posts/models.py like_user_set = models.ManyToManyField( settings.AUTH_USER_MODEL, related_name="like_post_set", through="likes.Like", ) # likes/models.py post = models.ForeignKey("posts.Post")
- 혹은
import
되는model
간의 관계를 잘 파악하여urls.py
내에 우선 순위를 잘 적어준 뒤,
이미import
되어 관계가 성립된model
은 다시 해당model
들을 명시할 필요가 없다.
(이럴 때에 서로 맞물려서circular import error
발생하는 것!)
생각보다 많은 팀이 겪은 에러는 아니었지만, 멘토님께 질문드리니 정말 당연하게도 주의해야하는 필수 사항이라고 하셨다.
앞으로도 더 많은 에러를 겪으면서 많은 상황에 대한 이해도가 높아지길 바래! ><