如何解决Django模型中的循环导入?

2024-10-02 12:31:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我在django中创建了一个应用程序:讲座

touch.models中的代码

class SchoolDepartment(models.Model):
    id = models.AutoField(primary_key=True)


class Professor(models.Model):
    id = models.AutoField(primary_key=True)
    school_department = models.ForeignKey(SchoolDepartment)


class Lecture(models.Model):
    id = models.AutoField(primary_key=True)
    professor = models.ForeignKey(Professor)
    school_department = models.ForeignKey(SchoolDepartment)

当我运行时,这段代码会引发错误

ImportError: cannot import name 'SchoolDepartment' from partially initialized module 'lecture.models' (most likely due to a circular import)

我必须知道,错误是由于循环导入造成的。
所以我像这样修改代码

class SchoolDepartment(models.Model):
    id = models.AutoField(primary_key=True)


class Professor(models.Model):
    id = models.AutoField(primary_key=True)
    school_department = models.ForeignKey('lecture.SchoolDepartment')


class Lecture(models.Model):
    id = models.AutoField(primary_key=True)
    professor = models.ForeignKey(Professor)
    school_department = models.ForeignKey('lecture.SchoolDepartment')

但仍然会引起错误。 这是完全的追踪

namsul_web | Watching for file changes with StatReloader
namsul_web | Exception in thread django-main-thread:
namsul_web | Traceback (most recent call last):
namsul_web |   File "/usr/local/lib/python3.9/threading.py", line 950, in _bootstrap_inner
namsul_web |     self.run()
namsul_web |   File "/usr/local/lib/python3.9/threading.py", line 888, in run
namsul_web |     self._target(*self._args, **self._kwargs)
namsul_web |   File "/usr/local/lib/python3.9/site-packages/django/utils/autoreload.py", line 53, in wrapper
namsul_web |     fn(*args, **kwargs)
namsul_web |   File "/usr/local/lib/python3.9/site-packages/django/core/management/commands/runserver.py", line 110, in inner_run
namsul_web |     autoreload.raise_last_exception()
namsul_web |   File "/usr/local/lib/python3.9/site-packages/django/utils/autoreload.py", line 76, in raise_last_exception
namsul_web |     raise _exception[1]
namsul_web |   File "/usr/local/lib/python3.9/site-packages/django/core/management/__init__.py", line 357, in execute
namsul_web |     autoreload.check_errors(django.setup)()
namsul_web |   File "/usr/local/lib/python3.9/site-packages/django/utils/autoreload.py", line 53, in wrapper
namsul_web |     fn(*args, **kwargs)
namsul_web |   File "/usr/local/lib/python3.9/site-packages/django/__init__.py", line 24, in setup
namsul_web |     apps.populate(settings.INSTALLED_APPS)
namsul_web |   File "/usr/local/lib/python3.9/site-packages/django/apps/registry.py", line 114, in populate
namsul_web |     app_config.import_models()
namsul_web |   File "/usr/local/lib/python3.9/site-packages/django/apps/config.py", line 211, in import_models
namsul_web |     self.models_module = import_module(models_module_name)
namsul_web |   File "/usr/local/lib/python3.9/importlib/__init__.py", line 127, in import_module
namsul_web |     return _bootstrap._gcd_import(name[level:], package, level)
namsul_web |   File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
namsul_web |   File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
namsul_web |   File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
namsul_web |   File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
namsul_web |   File "<frozen importlib._bootstrap_external>", line 790, in exec_module
namsul_web |   File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
namsul_web |   File "/opt/project/NamSul/account/models.py", line 4, in <module>
namsul_web |     from lecture.models import Lecture, Professor
namsul_web |   File "/opt/project/NamSul/lecture/models.py", line 4, in <module>
namsul_web |     from .managers import SchoolDepartmentManager
namsul_web |   File "/opt/project/NamSul/lecture/managers.py", line 2, in <module>
namsul_web |     from .models import SchoolDepartment, Professor
namsul_web | ImportError: cannot import name 'SchoolDepartment' from partially initialized module 'lecture.models' (most likely due to a circular import) (/opt/project/NamSul/lecture/models.py)

这是我在设置文件中安装的应用程序

...
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'main.apps.MainConfig',
    'account.apps.AccountConfig',
    'lecture.apps.LectureConfig',
    'board.apps.BoardConfig',
    'traffic.apps.TrafficConfig',
    'corona.apps.CoronaConfig',
]
...

我怎样才能修好它


Tags: djangoinpyimportwebmodelslibusr

热门问题