Python 导入错误:无法导入名称';ConfigSerializer';从部分初始化的模块';api.serializers';

Python 导入错误:无法导入名称';ConfigSerializer';从部分初始化的模块';api.serializers';,python,django,django-rest-framework,Python,Django,Django Rest Framework,我一直在试图了解应用程序的哪一部分有循环导入,但我就是无法得到其中的逻辑流。请允许我向您展示这个名为“api”的应用程序的目录树: 当我运行单元测试时,会出现以下错误: ERROR: api.serializers (unittest.loader._FailedTest) ---------------------------------------------------------------------- ImportError: Failed to import test modul

我一直在试图了解应用程序的哪一部分有循环导入,但我就是无法得到其中的逻辑流。请允许我向您展示这个名为“api”的应用程序的目录树:

当我运行单元测试时,会出现以下错误:

ERROR: api.serializers (unittest.loader._FailedTest)
----------------------------------------------------------------------
ImportError: Failed to import test module: api.serializers
Traceback (most recent call last):
  File "/usr/local/Cellar/python@3.8/3.8.6/Frameworks/Python.framework/Versions/3.8/lib/python3.8/unittest/loader.py", line 470, in _find_test_path
    package = self._get_module_from_name(name)
  File "/usr/local/Cellar/python@3.8/3.8.6/Frameworks/Python.framework/Versions/3.8/lib/python3.8/unittest/loader.py", line 377, in _get_module_from_name
    __import__(name)
  File "/Users/nick/work/shiftwork_backend/api/serializers/__init__.py", line 1, in <module>
    from .default import (random_string_generator, WorkTypeSerializer, PatternSerializer,
  File "/Users/nick/work/shiftwork_backend/api/serializers/default.py", line 10, in <module>
    from api import views
  File "/Users/nick/work/shiftwork_backend/api/views/__init__.py", line 1, in <module>
    from .base import (ActionBasedPermission, get_server_status, validate_token,
  File "/Users/nick/work/shiftwork_backend/api/views/base.py", line 10, in <module>
    from api.serializers import ConfigSerializer
ImportError: cannot import name 'ConfigSerializer' from partially initialized module 'api.serializers' (most likely due to a circular import) (/Users/nick/work/shiftwork_backend/api/serializers/__init__.py)
和视图/init.py如下所示:

from .base import (ActionBasedPermission, get_server_status, validate_token,
                get_user_company_by_local_id, get_user_pattern_by_local_id, logger
                )
我检查了serializers/default.py:

from api import views
from api.models import (LANGUAGE_CODE_CHOICES, COUNTRY_CODE_CHOICES, SHARE_ON_OFF_TOGGLE,
    STATUS_CHOICES, Category, Company, User, Pattern, ChangeWorkSchedule,
    UserChangeWorkSchedule, UserWorkCondition, UserColorPreset, WorkType, Holiday,
    VacationType, Vacation, VacationData, Salary, Config, OTType, OverTimePeriod,
    OTData, OTAutoExceptDate, Memo, Alarm, LockedPattern, UserCompany,
    UserWorkSchedule, UserPattern, UserWorkType, WorkTypePeriod, MemoTodo,
    CompanyMapping, Share, ShareHistory, Icon, IconVersion, Location, Address, Weather
)
最后,再次检查serializers/init.py:

from .default import (random_string_generator, WorkTypeSerializer, PatternSerializer,
                    ChangeWorkScheduleSerializer, CategorySerializer, CompanyMiniSerializer,
                    CompanySerializer, UserCompanySerializer, UserWorkTypeSerializer,
                    WorkTypePeriodSerializer, UserSerializer, HolidaySerializer,
                    SalaryPatternSerializer, VacationTypeSerializer, VacationSerializer,
                    VacationDataSerializer, CompanyMappingSerializer, ConfigSerializer,
                    OTTypeSerializer, OTPeriodSerializer, OTDataSerializer,
                    OTAutoExceptDateSerializer, MemoSerializer, MemoTodoSerializer,
                    AlarmSerializer, LockedPatternSerializer, UserPatternSerializer,
                    UserWorkScheduleSerializer, UserChangeWorkScheduleSerializer,
                    UserWorkConditionSerializer, UserColorPresetSerializer,
                    CustomTokenObtainPairSerializer, CustomTokenObtainPairView,
                    IconSerializerView, NewsSerializerView
                    )
from .backup import *
我仍然不明白我怎样才能开始解决这个问题


非常感谢

您正在进行循环导入。您不应该使用通配符导入,因为它们会使此类问题几乎无法跟踪。我刚刚更新并删除了所有通配符,但它仍然抱怨循环导入。回溯时,您的导入将:
序列化程序
→ <代码>序列化程序。默认值→ <代码>视图→ <代码>视图.基础→ <代码>序列化程序。你必须通过重新组织导入或重新组织代码来打破这个循环。你知道,这是一个黑客行为,但你可以在最后一刻
导入ConfigSerializer
,只要你需要它,在函数体`def foo():import ConfigSerializer。。。这仍然会在你的东西中留下代码的味道,但至少你可以继续前进。在命令行脚本中导入Django模型时,我经常遇到这种情况。这甚至不是一个很大的性能影响,因为模块只在第一次真正加载一次,而不是每次您点击导入时加载。它对ConfigSerializer有效,但对其他序列化程序也发生了同样的情况。因此,我在最后一刻将它们更改为导入XXXXSerializer,但不起作用
from .default import (random_string_generator, WorkTypeSerializer, PatternSerializer,
                    ChangeWorkScheduleSerializer, CategorySerializer, CompanyMiniSerializer,
                    CompanySerializer, UserCompanySerializer, UserWorkTypeSerializer,
                    WorkTypePeriodSerializer, UserSerializer, HolidaySerializer,
                    SalaryPatternSerializer, VacationTypeSerializer, VacationSerializer,
                    VacationDataSerializer, CompanyMappingSerializer, ConfigSerializer,
                    OTTypeSerializer, OTPeriodSerializer, OTDataSerializer,
                    OTAutoExceptDateSerializer, MemoSerializer, MemoTodoSerializer,
                    AlarmSerializer, LockedPatternSerializer, UserPatternSerializer,
                    UserWorkScheduleSerializer, UserChangeWorkScheduleSerializer,
                    UserWorkConditionSerializer, UserColorPresetSerializer,
                    CustomTokenObtainPairSerializer, CustomTokenObtainPairView,
                    IconSerializerView, NewsSerializerView
                    )
from .backup import *