You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 05:55:46