首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django模型递归导入-如何解决

django模型递归导入-如何解决
EN

Stack Overflow用户
提问于 2012-02-17 07:36:13
回答 3查看 4.7K关注 0票数 9

我有一个模特project_phase

代码语言:javascript
复制
    from django.db import models
    from django.utils import simplejson
    from core.models import pmo_review_task

它引用pmo_review_task (因为它在保存ovewrite中创建了一个pmo_review_task )

代码语言:javascript
复制
from django.db import models
from datetime import datetime
from django.contrib.auth.models import User
from core.models import sc_review_task

它引用引用project_phase的project_phase (因为它在保存的project_phase中创建了一个project_phase)

代码语言:javascript
复制
from django.db import models
from core.models import project_phase

因此,它以project_phase导入、pmo_review_task导入、sc_review_task导入、project_phase结束,我猜它以某种方式产生了这个错误:

代码语言:javascript
复制
Unhandled exception in thread started by <bound method Command.inner_run of <django.core.management.commands.runserver.Command object at 0x010ACFB0>>
Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\django\core\management\commands\runserver.py", line 88, in inner_run
    self.validate(display_num_errors=True)
  File "C:\Python27\lib\site-packages\django\core\management\base.py", line 249, in validate
    num_errors = get_validation_errors(s, app)
  File "C:\Python27\lib\site-packages\django\core\management\validation.py", line 35, in get_validation_errors
    for (app_name, error) in get_app_errors().items():
  File "C:\Python27\lib\site-packages\django\db\models\loading.py", line 146, in get_app_errors
    self._populate()
  File "C:\Python27\lib\site-packages\django\db\models\loading.py", line 64, in _populate
    self.load_app(app_name)
  File "C:\Python27\lib\site-packages\django\db\models\loading.py", line 78, in load_app
    models = import_module('.models', app_name)
  File "C:\Python27\lib\site-packages\django\utils\importlib.py", line 35, in import_module
    __import__(name)
  File "C:\work\Portman\core\models\__init__.py", line 4, in <module>
    from pmo_review_task import pmo_review_task
  File "C:\work\Portman\core\models\pmo_review_task.py", line 5, in <module>
    from core.models import sc_review_task
  File "C:\work\Portman\core\models\sc_review_task.py", line 3, in <module>
    from core.models import project_phase
  File "C:\work\Portman\core\models\project_phase.py", line 4, in <module>
    from core.models import pmo_review_task
ImportError: cannot import name pmo_review_task

我该如何克服这一切?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-17 07:49:15

有两种方式:

  1. 在方法中导入模型(如@YujiTomita建议的那样).
  2. django.db.models中使用get_model函数,该函数是为惰性模型导入而设计的.:

'project_phase') = project_phase =get_model(“核心”)

我更喜欢第二种方法,但两种方法都可以。

票数 20
EN

Stack Overflow用户

发布于 2012-02-17 07:38:44

project_phase方法中导入save

只要代码被执行,导入就会被调用。

如果它位于全局模块命名空间中(在顶部),那么它将立即被调用,您将遇到您所描述的循环导入问题,因为一个文件导入另一个文件,该文件导入原始文件。

如果将问题导入语句放入函数中,则在导入文件时调用它。

代码语言:javascript
复制
import foo # executed upon importing this file. 

def import_foo_when_called():
    import foo # only executed when function is called, thus no problems when 
               # another module imports this file.
票数 7
EN

Stack Overflow用户

发布于 2018-03-14 17:53:55

Django 1.9及以上

因为get_model()在django.db.models中已经在1.9中被删除。

使用django.apps.get_model()

类似问题:What is the equivalent of django.db.models.loading.get_model() in Django 1.9?

或者在引号中使用应用标签,如果您只是使用它来创建foreignkey。

而不是from core.models import project_phase

代码语言:javascript
复制
models.ForeignKey("core.project_phase")
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9324554

复制
相关文章

相似问题

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