Python Django应用程序依赖循环 我正在开发一个Django应用程序,它有相当复杂的模型(它是一个大学课程,模块,讲座,学生等)。

Python Django应用程序依赖循环 我正在开发一个Django应用程序,它有相当复杂的模型(它是一个大学课程,模块,讲座,学生等)。,python,django,dependencies,Python,Django,Dependencies,我已经将项目分为应用程序,以使整个项目更有条理(应用程序包括课程、学校、人员、模块和时间段)。我遇到了一个问题,一个应用程序中的模型可能依赖于另一个应用程序中的模型,因此我必须导入它。然后,第二个应用程序又取决于第一个应用程序中的模型,因此存在一个循环,Python抛出一个错误 人们是如何处理的?我理解应用程序应该相对“独立”,但在这样的系统中,使用ContentTypes将学生链接到模块是没有意义的 有人有类似的项目可以评论这个案例吗?通常我主张把功能分解成更小的应用程序,但是模型之间的循环依

我已经将项目分为应用程序,以使整个项目更有条理(应用程序包括课程、学校、人员、模块和时间段)。我遇到了一个问题,一个应用程序中的模型可能依赖于另一个应用程序中的模型,因此我必须导入它。然后,第二个应用程序又取决于第一个应用程序中的模型,因此存在一个循环,Python抛出一个错误

人们是如何处理的?我理解应用程序应该相对“独立”,但在这样的系统中,使用ContentTypes将学生链接到模块是没有意义的


有人有类似的项目可以评论这个案例吗?

通常我主张把功能分解成更小的应用程序,但是模型之间的循环依赖性反映了这样一个紧密的集成,你可能不会从分裂中获得很多,而可能只是考虑合并应用程序。如果这导致应用程序感觉太大,那么可能有一种方法可以沿不同的轴进行拆分,从而生成更合理的依赖关系图。

如果您看到的是循环模型依赖关系,我猜会发生以下三种情况之一:

  • 您已经定义了一个与已经定义的关系相反的关系(例如,两门课程都有许多课程,而两门课程都有一门课程),这在django中是多余的
  • 您在错误的应用程序中使用了模型方法
  • 您在模型方法中提供的功能应该在管理器中
也许你可以告诉我们这些模型中发生了什么,我们可以试着找出问题产生的原因。循环模型依赖性很少表示您需要组合两个应用程序-您的一个模型定义更可能出现问题(尽管不一定如此)


p、 我正在开发一个类似的django应用程序,但我的应用程序结构可能与您的完全不同。如果您感兴趣,我很乐意为您提供一个高级描述。

如果您的依赖项是在其他应用程序中引用模型的外键,则不需要导入其他模型。您可以在ForeignKey定义中使用字符串:

class MyModel(models.Model):
    myfield = models.ForeignKey('myotherapp.MyOtherModel')

这样就不需要导入MyOtherModel,因此不需要循环引用。Django在内部解析字符串,并且一切正常。

这可能不太适合您的情况,但是忽略问题的Django方面,打破循环依赖关系的一般技术是将一个交叉引用项分解为一个新模块。例如:

moduleA: class1, class2
           |        ^
           v        |
moduleB: class3, class4
可能成为:

moduleC: class 3
           ^
           |
moduleA: class 1, class 2
                     ^
                     |
moduleB:          class 4
(或者,您也可以将类2拆分为自己的模块。或者两者都拆分!)


当然,如果A类和B类相互依赖,这是没有帮助的。在这种情况下,也许它们应该在同一个模块中,或者更好的是,也许这些类的某些部分可以被分解成第三个模块,这两个类都依赖于第三个模块。

。我要详细说明的问题是,一个模块(模块应用程序)为它的学生提供了一个ForeignKey to Person(人员应用程序)。然后,people应用程序中的TutorGroup有一个模块外键,用于为特定模块分配一个导师组。这就是导致依赖循环的原因。如果还不清楚的话,我也可以贴一张模型图。我很想看看你们项目的总体结构——看看别人是怎么做的真的很有用。模块和人多对多之间的关系也是这样吗(看起来应该是这样的)?如果是这样,您可以亲自定义关系,并将相关的_name参数设置为“students”。然后module_instance.students.all()将为您提供我认为您正在寻找的查询集。就我而言,我没有个人模型。从课程到用户,我有两个m2m关系,一个用于学生,另一个用于教师。保持它的超级简单。是的,它目前适用于ManyToManyField的——我可以将它移到Person模型上——但它似乎不那么“整洁”——将它放在模块模型上是有意义的。我必须有一个“人”,因为它扩展了Django的用户,所以我可以添加更多的功能(如工作描述等)。我可以使用配置文件,但在我编写了一些中间件来返回人而不是用户之后,这就更简单了:)太棒了。这正是我想要的。有趣的是,我知道你可以这样做——因为我在ForeignKey引用文件后面定义的内容的地方使用它,但我从来没有想过用这种方式使用它。非常感谢你!在我找到你的帖子之前,我一直在尝试验证模型。它给我的只是一个错误:无法导入名称谢谢!这修复了在管理中删除具有FK关系的对象时出现的问题。在完成删除之前,我必须手动删除相关对象,这就解决了这个问题。谢天谢地,您的场景听起来不像是为应用程序设计的场景。应用程序的理念是可重用性(以及单独的打包、分发和版本控制)。你可以通过不将你的主题区域强制放入单独的应用程序来节省一些麻烦。