python - Django ImportError:无法从部分初始化的模块“accounts.models”导入名称“ReporterProfile”(很可能是由于循环导入)
问题描述
我有两个名为collection
,的应用程序accounts
。这两个应用程序都定义了模型。我正在将模型ReporterProfile
从accounts
app 导入到collection
. 同样,Report
从应用程序collection
到accounts
.
app 中的Report
模型collection
在 app 中的模型类方法中调用,accounts
如下所示:
from collection.models import Report
class ReporterProfile(models.Model):
....
def published_articles_number(self):
num = Report.objects.filter(reporterprofile=self.id).count()
return num
同样,我正在从应用程序导入模型到ReporterProfile
应用程序模型,如下所示:User
accounts
collection
from accounts.models import ReporterProfile, User
from <project_name> import settings
class Report(models.Model):
reporterprofile = models.ForeignKey(ReporterProfile, on_delete=models.CASCADE, verbose_name="Report Author")
...
class Comment(models.Model):
report = models.ForeignKey(Report, on_delete=models.CASCADE, related_name='comments')
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name="Comment by")
...
运行服务器或 makemigrations 时,出现错误:
文件“F:\project_name\accounts\models.py”,第 8 行,从 collection.models 导入报告
文件“F:\project_name\collection\models.py”,第 2 行,从 accounts.models 导入 ReporterProfile,用户
ImportError:无法从部分初始化的模块“accounts.models”导入名称“ReporterProfile”(很可能是由于循环导入)(F:\project_name\accounts\models.py)
我认为错误是由于错误的导入模式而出现的。我应该怎么办?
解决方案
对于ForeignKey
:
代替 using reporterprofile = models.ForeignKey(ReporterProfile, ...)
,您可以使用reporterprofile = models.ForeignKey("accounts.ReporterProfile", ...)
,因此您不必导入模型。
为了防止循环导入错误:
而不是使用:
from accounts.models import ReporterProfile
[...]
foo = ReporterProfile()
您可以使用:
import accounts.models
[...]
foo = accounts.models.ReporterProfile()
推荐阅读
- dart - 卡片重叠凸起按钮颤动
- vba - 我怎样才能写出螺旋形的代码?
- javascript - 在浏览器源代码调试工具中隐藏 ID
- hadoop - 从只读文件夹创建 HIVE 外部表
- java - 为什么 vaadin-grid 不显示链接(锚点)?
- unit-testing - 如何编写需要大量测试用例的 go 测试
- java - 无法使用 JAVA1.8 和 Tomcat 8.5.28 从 ConnectionWrapper 转换为 oracle.jdbc.OracleConnection
- sql - 编写一个查询以显示在他们出现的所有科目中获得超过 50 分的所有学生的姓名?
- api - WSO2 API 管理器无法正确响应 API
- javascript - 在数组中的第一个和最后一个元素之间交换,然后删除最后一个元素