我正在开发一个Django应用程序,它有相当复杂的模型(它模拟大学 - 课程,模块,讲座,学生等)。
我已将项目分为应用程序,以使整个事情更有条理(应用程序是课程,学校,人员,模块和时间段)。我有一个问题,即一个应用程序中的模型可能依赖于另一个应用程序中的模型 - 所以我必须导入它。然后第二个应用程序依赖于第一个应用程序中的模型,因此有一个循环,Python会引发错误。
人们如何处理这个问题?我知道应用程序应该相对“独立”,但在像这样的系统中,使用ContentTypes将学生链接到模块是没有意义的。
是否有人有类似的项目可以评论此案例?
答案 0 :(得分:55)
如果您的依赖项是使用引用其他应用程序中的模型的外键,则不需要导入其他模型。您可以在ForeignKey定义中使用字符串:
class MyModel(models.Model):
myfield = models.ForeignKey('myotherapp.MyOtherModel')
这种方式不需要导入MyOtherModel,因此没有循环引用。 Django在内部解析了字符串,它都按预期工作。
答案 1 :(得分:4)
这可能不太适合您的情况,但忽略了Django方面的问题,打破循环依赖关系的一般方法是将一个交叉引用的项目分解为一个新模块。例如:
moduleA: class1, class2
| ^
v |
moduleB: class3, class4
可能会成为:
moduleC: class 3
^
|
moduleA: class 1, class 2
^
|
moduleB: class 4
(或者,您可以将第2课打破到自己的模块中。或两者都可以!)
当然,如果A级和A级,这没有任何帮助。 B相互依赖。在这种情况下,也许它们应该在同一个模块中,或者更好的是,也许这些类的某些部分可以分成第三个模块,这两个类都依赖于它。
答案 2 :(得分:3)
如果你看到循环模型依赖,我猜测发生了三件事之一:
也许您可以告诉我们这些模型中发生了什么,我们可以尝试找出问题出现的原因。循环模型依赖很少表明您需要组合两个应用程序 - 更有可能(尽管不是绝对如此)您的某个模型定义存在问题。
P.S。我是在类似的django应用程序上工作,但我的应用程序结构可能与您的应用程序结构完全不同。如果您有兴趣,我很乐意给您一个高级别的描述。
答案 3 :(得分:1)
通常我主张将功能拆分为较小的应用程序,但模型之间的循环依赖反映了这种紧密集成,你可能没有从拆分中获得太多,可能只考虑合并应用程序。如果这导致应用程序感觉太大,可能有一种方法可以沿不同的轴进行拆分,从而产生更合理的依赖关系图。