ImportError: cannot import name 'Comment' from partially initialized module 'board.models' (most likely due to a circular import)

이유진·2022년 2월 28일
0

error 발생

게시판 만들기 프로젝트 초기셋팅을 완료후에 드디어 models.py를 작성하였다.
makemigrations를 진행하는 과정에서 ImportError가 발생하였다.....

지금까지 2~3번의 프로젝트를 진행하면서, 접해보지 못한 importerror였다.

(most likely due to a circular import)라고 되어있는 부분을 보아,
users app의 Like class와
board app의 Post, Comment class가
서로가 서로를 ForienKey로 참조하고 있기 때문에 무한으로 import를 하게되서 발생한 것으로 보여졌다.


구글링한 결과, 이와 같은
ImportError는 Python typing 이나 django model에서 주로 발생한다고 한다.


그래서,

해결방법!은

from board.models import Post, Comment

import 부분을 제거하고,

  1. 👇 변경 전 👇
post = models.Foreignkey('Post', on_delete=models.CASCADE)

👇 변경 후 👇

post = models.ForeignKey('board.Post', on_delete=models.CASCADE)

class명만 작성하는 대신, app명.class명으로 작성한다.


결과

무한의 Import 굴레에서 벗어나게 되었다....ㅠ


코드

< 👇 수정 전 👇 >

# users - models.py
from django.db import models
from board.models import Post, Comment
from core.models import TimeStampModel

class User(TimeStampModel):
    name = models.CharField(max_length=100)
    phone_number = models.CharField(max_length=100)
    profile_image_url = models.ImageField(max_length=200)
    description = models.TextField()
    kakao_id = models.IntegerField()
    email = models.CharField(max_length=500)

    class Meta:
        db_table = 'users'

class Like(models.Model):
    isLiked = models.BooleanField()
    user = models.ForeignKey('User', on_delete=models.CASCADE)
    post = models.ForeignKey('Post', on_delete=models.CASCADE)
    comment = models.ForeignKey('Comment', on_delete=models.CASCADE) 
    
    class Meta:
        db_table = 'likes'

< 👇 수정 후 👇 >

# users - models.py
from django.db import models
from core.models import TimeStampModel

class User(TimeStampModel):
    name = models.CharField(max_length=100)
    phone_number = models.CharField(max_length=100)
    profile_image_url = models.ImageField(max_length=200)
    description = models.TextField()
    kakao_id = models.IntegerField()
    email = models.CharField(max_length=500)

    class Meta:
        db_table = 'users'

class Like(models.Model):
    isLiked = models.BooleanField()
    user = models.ForeignKey('User', on_delete=models.CASCADE)
    post = models.ForeignKey('board.Post', on_delete=models.CASCADE)
    comment = models.ForeignKey('board.Comment', on_delete=models.CASCADE) 
    
    class Meta:
        db_table = 'likes'

circular dependency 참고한 블로그

profile
차근차근 배워나가는 주니어 개발자

0개의 댓글