[문제해결 | django] ImportError: cannot import name 'UserSchedule' from partially initialized module 'calendars.models' (most likely due to a circular import)

ljkgb·2021년 8월 8일

문제 해결

목록 보기
3/3

django에서 모델을 패키지화하여 작업중 migration이 안됐다.. docker와 dbeaver등 처음 사용해보는 툴로 인한 오류인지 계속해서 구글링하다가 결국은 역시나 간단한 문제였다!

오류

ImportError: cannot import name 'UserSchedule' from partially initialized module 'calendars.models' (most likely due to a circular import) (/app/calendars/models/__init__.py)

기존 코드

디렉토리 구조

init.py

from .schedule import Schedule
from .user_schedule import UserSchedule

schedule.py

from django.db import models

from sales.models import CreateTime
from companies.models import Company, Contact
from users.models import User
from calendars.models import UserSchedule


class Schedule(CreateTime):
    title = models.CharField(max_length=300)
    content = models.TextField()
    date = models.DateTimeField()
    company = models.ForeignKey(Company, on_delete=models.CASCADE)
    contact = models.ForeignKey(Contact, on_delete=models.SET_NULL, null=True)
    user = models.ManyToManyField(User, through=UserSchedule)  ## 문제부분

    def __str__(self):
        return self.title
        
    class Meta:
        db_table = 'schedules'

시도

import 순서의 문제인거는 파악했고 user_schedule을 중간테이블로 참조하는 schedule모델과 schedule를 참조하는 user_schedule을 순서 문제없이 사용할 수 있을 까 고민하기 위해 __init__.pyfrom . import *을 했지만 해결되지 않았다 ㅠㅠ

migration이 되는 듯 보이지만 calendars 앱을 인식못해 제외하고 migration이 된다 ㅠㅠㅠㅠ!!!

해결

__init__.py는 그대로 두고 참조시 'UserSchedule'로 하면.. 끗........

from django.db import models

from sales.models import CreateTime
from companies.models import Company, Contact
from users.models import User


class Schedule(CreateTime):
    title = models.CharField(max_length=300)
    content = models.TextField()
    date = models.DateTimeField()
    company = models.ForeignKey(Company, on_delete=models.CASCADE)
    contact = models.ForeignKey(Contact, on_delete=models.SET_NULL, null=True)
    user = models.ManyToManyField(User, through='UserSchedule')

    def __str__(self):
        return self.title
        
    class Meta:
        db_table = 'schedules'

헤헤 그래도 해결해서 기분 쥬아~~~

profile
🐹

0개의 댓글