[장고 에러] OperationalError: cannot import name

소요 시간: 1분

웹 개발 과정에서 다양한 에러를 만날 수 있지만, 그 중에서도 특히 골치 아픈 것이 바로 장고(Django)에서의 OperationalError: cannot import name 오류입니다. 이 글에서는 이 에러가 발생하는 원인과 해결 방법에 대해 알아보겠습니다.


문제 발생 원인

먼저, 에러 메시지는 다음과 같습니다.

cannot import name 'Post' from partially initialized module 'posts.models' (most likely due to a circular import)

이 에러는 순환 참조(circular import) 문제로 인해 발생합니다. 순환 참조란 두 개 이상의 모듈이 서로를 불러오는 상황을 말합니다. 예를 들어, posts.models 모듈에서 Post 클래스를 가져오려고 시도했지만, 이 과정에서 순환 참조가 발생하여 모듈이 완전히 초기화되지 않은 상태에서 접근하려 했기 때문에 오류가 발생한 것입니다.


문제 해결 과정

에러의 원인을 파악하기 위해 변경된 코드를 점검하고, 데이터베이스를 직접 조회했습니다. 조회 결과, category 필드가 정상적으로 존재함에도 불구하고 여전히 문제가 발생했습니다. 이는 코드상의 문제가 아닌 순환 참조 문제임을 확인할 수 있었습니다.


해결 방법

순환 참조 문제를 해결하는 방법은 간단합니다. 함수나 메서드 내부에서 모듈을 불러오는 방식으로 수정하면 됩니다. 아래 예시 코드를 통해 자세히 설명하겠습니다.

예시 코드 수정 전

from posts.models import Post

class Category(models.Model):
    # 기타 필드

    def number_of_post(self):
        return Post.objects.filter(category=self, status='published').count()

위 코드는 Category 클래스 정의 시점에 Post 모듈을 불러오므로 순환 참조 문제가 발생할 수 있습니다.

예시 코드 수정 후

class Category(models.Model):
    # 기타 필드

    def number_of_post(self):
        from posts.models import Post
        return Post.objects.filter(category=self, status='published').count()

수정된 코드에서는 number_of_post 메서드 내부에서 Post 모듈을 불러옵니다. 이로써 순환 참조 문제를 피할 수 있으며, 필요한 시점에만 모듈을 불러오기 때문에 에러가 발생하지 않습니다.


결론

이번 글에서는 장고에서 발생하는 OperationalError: cannot import name 에러의 원인과 해결 방법에 대해 알아보았습니다. 순환 참조 문제는 함수나 메서드 내부에서 모듈을 불러오는 방식으로 간단하게 해결할 수 있습니다. 이와 같은 방식을 통해 코드의 가독성을 유지하면서도 에러를 예방할 수 있습니다. 앞으로 비슷한 문제가 발생할 때 이 방법을 적용해 보세요.

장고 리스트