Django导入错误:无法从DATABASE.models导入RightsMaster(疑似循环导入)
问题:Django循环导入导致ImportError无法导入RightsMaster
错误信息:
from DATABASE.models import ModuleMaster, PageMaster, RightsMaster
ImportError: cannot import name 'RightsMaster' from partially initialized module 'DATABASE.models' (most likely due to a circular import) (C:\Users\ADMIN\Desktop\python server\DATABASE\models__init__.py)
相关代码文件
module_page.py
from django.db import models class ModuleMaster(models.Model): active = models.BooleanField(default=True) id = models.BigAutoField(primary_key=True) name = models.CharField(max_length=80) icon_class = models.CharField(max_length=100) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return self.name class Meta: managed = False db_table = 'module_master' class PageMaster(models.Model): id = models.BigAutoField(primary_key=True) active = models.BooleanField(default=True) module = models.ForeignKey(ModuleMaster, models.DO_NOTHING) name = models.CharField(max_length=80) path = models.CharField(max_length=255) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return self.name class Meta: managed = False db_table = 'page_master'
rights_master.py
from django.db import models class RightsMaster(models.Model): full_name = models.CharField(max_length=30, default='', blank=True, null=True) short_name = models.CharField(max_length=4, default='') description = models.CharField(max_length=80, default='', blank=True, null=True) active = models.BooleanField(default=True) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: db_table = 'rights_master'
user_rights.py
from django.db import models from DATABASE.models import ModuleMaster, PageMaster, RightsMaster class UserRights(models.Model): user = models.CharField(max_length=30) right = models.ForeignKey(RightsMaster, models.CASCADE) module = models.ForeignKey(ModuleMaster, models.CASCADE) page = models.ForeignKey(PageMaster, models.CASCADE) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: db_table = 'user_rights'
init.py
from .profocus_py.module_page import ModuleMaster, PageMaster from .profocus_py.user_rights import UserRights from .profocus_py.rights_master import RightsMaster
解决方案
循环导入的核心原因:__init__.py先导入user_rights.py,而user_rights.py又从DATABASE.models导入RightsMaster,但此时RightsMaster还未被__init__.py完成初始化,导致模块部分加载的错误。
提供两种可行解决方式:
方法一:调整__init__.py的导入顺序
将RightsMaster的导入放在UserRights之前,确保user_rights.py请求导入时,RightsMaster已经完成初始化:
from .profocus_py.module_page import ModuleMaster, PageMaster from .profocus_py.rights_master import RightsMaster from .profocus_py.user_rights import UserRights
方法二:修改user_rights.py的导入逻辑(更稳妥)
跳过DATABASE.models的中间导入层,直接从对应文件导入模型,彻底规避循环依赖:
from django.db import models from .module_page import ModuleMaster, PageMaster from .rights_master import RightsMaster
这种方式不受__init__.py导入顺序影响,是更推荐的长期解决方案。
内容的提问来源于stack exchange,提问作者Abhay Pratap Rana
相关产品推荐
相关产品推荐

