Django运行makemigrations报错无法导入模型(大概率为循环导入问题)
问题原因
你遇到的是典型的Django跨应用模型循环导入报错:user应用的模型文件顶部导入了polls应用的PollQuestion模型,同时polls应用的模型文件顶部又导入了user应用的UserProfile模型,Python加载模块时需要双方都完成初始化才能继续,陷入了死锁。
解决方案
你只需要调整导入的位置即可,不需要修改现有逻辑:
- 删除
user/models.py文件顶部的from polls.models import PollQuestion导入语句 - 将
PollQuestion的导入移动到get_all_polls方法内部,修改后的代码如下:
class UserProfile(models.Model): user = models.OneToOneField(CustomUser, on_delete=models.CASCADE) def get_all_polls(self): # 把导入移到方法内部,仅方法调用时才会执行导入,此时模块已完成初始化 from polls.models import PollQuestion all_polls = PollQuestion.objects.all().count() return 10
补充优化方案(可选)
针对模型关联场景的循环导入,Django本身支持用字符串格式的模型路径引用关联对象,不需要直接导入模型。比如你可以把PollQuestion里的外键定义修改为如下格式,就可以删掉polls/models.py顶部的from user.models import UserProfile导入语句,从根源避免循环导入:
user = models.ForeignKey("user.UserProfile", null=True, on_delete=models.CASCADE)
修改完成后重新执行python manage.py makemigrations即可正常生成迁移文件。
内容的提问来源于stack exchange,提问作者Atharva
相关产品推荐
相关产品推荐

