我关注了这篇文章here,整理了如何将一个模型的ForeignKey设置为另一个应用程序中的模型。然而,当我第二次尝试它时,我得到了一个错误,并且不确定为什么。
我有一个带有“项目”和“注释”模型的Central应用程序,还有一个带有报表模型的报表应用程序。在Reports应用程序中,'annotation‘有一个指向'report’的FK,这在下面的代码中似乎工作得很好:
#models.py for Central app
from GIanno.pt_reports.models import Report
class annotation(models.Model):
...
report=models.ForeignKey(Report)但是,在Reports应用程序中,当我尝试为'report‘设置FK以使用与上述相同的格式将其链接到'Central’应用程序中的'project‘时,我收到错误消息"cannot import name 'project’from the import line“。
任何关于为什么它以一种方式工作而不是另一种方式工作的想法。顺序在某种程度上很重要吗?谢谢
发布于 2011-04-16 02:28:02
我的猜测是您已经创建了一个循环导入条件。当您从一个python模块导入某些内容,而该python模块又从试图导入它的模块导入时,就会发生这种情况,从而阻止了导入问题的解决。
一般来说,有三种处理循环导入的策略,其中两种在这种情况下有效:
report=models.ForeignKey('central.Report')懒惰的FK分辨率(#2)可能是你在这里最好的选择。一般来说,最好的策略是尽可能简化模型/模块的排列,以避免循环导入。
发布于 2011-04-16 01:55:31
尝试:
class annotation(models.Model):
...
report=models.ForeignKey('centralapp.Report')在不需要导入的情况下,将'centralapp‘替换为您的中心应用名称。
发布于 2013-08-31 04:26:59
惰性关系可能有用的另一个场景是导入顺序。它不是循环引用(它不能区分谁是第一个),而是一段代码在另一段代码加载之前加载的情况。
例如,假设我有一个Doc Model和一个Log Model。日志模型具有文档的FK,因此我可以记录文档中的更改。这可以很好地工作,直到我尝试在我的Doc模型的save方法中生成一个Log记录(以创建一个save事件日志条目)。在这种情况下,Doc对象中没有日志主键,但也有类似的问题。
在这种情况下,您会遇到导入顺序问题,其中将尝试引用尚未加载到Python中的内容。它类似于循环引用,但原因不同。
这可以用其他方法来解决,但这是你会遇到这个问题的另一个例子。
https://stackoverflow.com/questions/5680414
复制相似问题