Django 模型如何修复循环导入错误?
Django models how to fix circular import error?
我阅读了错误的解决方案(写 import
而不是 from ...
),但我认为它不起作用,因为我有一个复杂的文件夹结构。
目录结构
quiz/models.py
import apps.courses.models as courses_models
class Quiz(models.Model):
lesson = models.ForeignKey(courses_models.Lesson, on_delete=models.DO_NOTHING) # COURSE APP MODEL IMPORTED
courses/models.py
import apps.quiz.models as quiz_models
class Lesson(models.Model):
...
class UserCompletedMaterial(models.Model):
...
lesson = models.ForeignKey(Lesson)
quiz = models.ForeignKey(quiz_models.Quiz) # QUIZ APP MODEL IMPORTED
你怎么看我就是不能把它放在一起或别的什么..
因为我认为 UserCompletedMaterial
模型是 courses
app
的一部分
这两个模型相互引用,因此这意味着为了解释前者,我们需要后者,反之亦然。
Django 对此有一个解决方案:您不仅可以将 class
的引用作为 target 模型传递给 ForeignKey
(或另一个关系如 OneToOneField
或 ManyToManyField
),但也可以通过 string.
如果模型在同一个应用程序中,您可以使用字符串 '<i>ModelName</i>'
,如果模型已定义在另一个 installed 应用程序中,您可以使用 '<i>app_name</i>.<i>ModelName</i>'
。在这种情况下,我们可以删除循环导入:
# do <i>not</i> import the `courses.models
class Quiz(models.Model):
lesson = models.ForeignKey(
<b>'courses.Lesson'</b>,
on_delete=models.DO_NOTHING
)
# …
我阅读了错误的解决方案(写 import
而不是 from ...
),但我认为它不起作用,因为我有一个复杂的文件夹结构。
目录结构
quiz/models.py
import apps.courses.models as courses_models
class Quiz(models.Model):
lesson = models.ForeignKey(courses_models.Lesson, on_delete=models.DO_NOTHING) # COURSE APP MODEL IMPORTED
courses/models.py
import apps.quiz.models as quiz_models
class Lesson(models.Model):
...
class UserCompletedMaterial(models.Model):
...
lesson = models.ForeignKey(Lesson)
quiz = models.ForeignKey(quiz_models.Quiz) # QUIZ APP MODEL IMPORTED
你怎么看我就是不能把它放在一起或别的什么..
因为我认为 UserCompletedMaterial
模型是 courses
app
这两个模型相互引用,因此这意味着为了解释前者,我们需要后者,反之亦然。
Django 对此有一个解决方案:您不仅可以将 class
的引用作为 target 模型传递给 ForeignKey
(或另一个关系如 OneToOneField
或 ManyToManyField
),但也可以通过 string.
如果模型在同一个应用程序中,您可以使用字符串 '<i>ModelName</i>'
,如果模型已定义在另一个 installed 应用程序中,您可以使用 '<i>app_name</i>.<i>ModelName</i>'
。在这种情况下,我们可以删除循环导入:
# do <i>not</i> import the `courses.models
class Quiz(models.Model):
lesson = models.ForeignKey(
<b>'courses.Lesson'</b>,
on_delete=models.DO_NOTHING
)
# …