[ ERROR ] How to solve circular import error with dJango Models

Hailee·2020년 12월 18일
0

[ TIL ]

목록 보기
30/40
post-thumbnail

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발생하는 것!)

생각보다 많은 팀이 겪은 에러는 아니었지만, 멘토님께 질문드리니 정말 당연하게도 주의해야하는 필수 사항이라고 하셨다.

앞으로도 더 많은 에러를 겪으면서 많은 상황에 대한 이해도가 높아지길 바래! ><

profile
웹 개발 🐷😎👊🏻🔥

0개의 댓글