首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django从另一个应用程序模型中的外键导入错误

Django从另一个应用程序模型中的外键导入错误
EN

Stack Overflow用户
提问于 2011-04-16 01:41:06
回答 3查看 5.7K关注 0票数 4

我关注了这篇文章here,整理了如何将一个模型的ForeignKey设置为另一个应用程序中的模型。然而,当我第二次尝试它时,我得到了一个错误,并且不确定为什么。

我有一个带有“项目”和“注释”模型的Central应用程序,还有一个带有报表模型的报表应用程序。在Reports应用程序中,'annotation‘有一个指向'report’的FK,这在下面的代码中似乎工作得很好:

代码语言:javascript
复制
#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“。

任何关于为什么它以一种方式工作而不是另一种方式工作的想法。顺序在某种程度上很重要吗?谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-16 02:28:02

我的猜测是您已经创建了一个循环导入条件。当您从一个python模块导入某些内容,而该python模块又从试图导入它的模块导入时,就会发生这种情况,从而阻止了导入问题的解决。

一般来说,有三种处理循环导入的策略,其中两种在这种情况下有效:

  1. 移动您的类和导入,以便导入只有一个方向。
  2. 使用惰性求值。在Django的例子中,这可以通过使用点符号传递指定应用程序名称和型号的字符串来实现:report=models.ForeignKey('central.Report')
  3. Move将ForeignKey语句从全局模块作用域转移到模块内的函数作用域中。这样就不会立即评估导入,并且模块可以作为一个整体成功导入,同时仍然允许在调用模块时在模块内进行导入。(注意:这不适用于ForeignKey relationships)

懒惰的FK分辨率(#2)可能是你在这里最好的选择。一般来说,最好的策略是尽可能简化模型/模块的排列,以避免循环导入。

票数 13
EN

Stack Overflow用户

发布于 2011-04-16 01:55:31

尝试:

代码语言:javascript
复制
class annotation(models.Model):
    ... 
    report=models.ForeignKey('centralapp.Report')

在不需要导入的情况下,将'centralapp‘替换为您的中心应用名称。

票数 1
EN

Stack Overflow用户

发布于 2013-08-31 04:26:59

惰性关系可能有用的另一个场景是导入顺序。它不是循环引用(它不能区分谁是第一个),而是一段代码在另一段代码加载之前加载的情况。

例如,假设我有一个Doc Model和一个Log Model。日志模型具有文档的FK,因此我可以记录文档中的更改。这可以很好地工作,直到我尝试在我的Doc模型的save方法中生成一个Log记录(以创建一个save事件日志条目)。在这种情况下,Doc对象中没有日志主键,但也有类似的问题。

在这种情况下,您会遇到导入顺序问题,其中将尝试引用尚未加载到Python中的内容。它类似于循环引用,但原因不同。

这可以用其他方法来解决,但这是你会遇到这个问题的另一个例子。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5680414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档