循环导入只是停止Django命令,而不是shell或web响应

循环导入只是停止Django命令,而不是shell或web响应,django,django-models,command,circular-reference,django-manage.py,Django,Django Models,Command,Circular Reference,Django Manage.py,我有两个相互导入的类: profile/models.py class Company(models.Model): name = ... class CompanyReview(models.Model): company = models.ForeignKey(Company) from action.models import CompanyAction action = models.ForeignKey(CompanyAction) from pro

我有两个相互导入的类:

profile/models.py

class Company(models.Model):
    name = ...

class CompanyReview(models.Model):
    company = models.ForeignKey(Company)
    from action.models import CompanyAction
    action = models.ForeignKey(CompanyAction)
from profile.models import Company
class CompanyAction(models.Model):
    company = models.ForeignKey(Company, null = True, blank = True)
动作/模型.py

class Company(models.Model):
    name = ...

class CompanyReview(models.Model):
    company = models.ForeignKey(Company)
    from action.models import CompanyAction
    action = models.ForeignKey(CompanyAction)
from profile.models import Company
class CompanyAction(models.Model):
    company = models.ForeignKey(Company, null = True, blank = True)
当Django应用程序在服务器上执行时,或者当我在shell中调用view函数时,循环导入就可以工作。但是,当我导入其中一个类时,Django命令将失败并出现错误(请参见下面的回溯)

为什么会出现这种情况,并且只会导致
命令方法出现问题?
我怎样才能避免这个错误?我尝试了延迟导入
CompanyAction
类,但它导致了相同的错误消息。

不工作替代方案:

class CompanyReview(models.Model):
    company = models.ForeignKey(Company)
    from django.db.models import get_model
    _model = get_model('action', 'CompanyAction')
    action = models.ForeignKey(_model)
有趣的是,如果执行命令函数并导入类,则变量
\u model
空。加载
/manage.py shell
时,变量包含正确的类名。为什么会这样

回溯

(virtual-env)PC:neurix$ python manage.py close_action
Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/Users/Development/virtual-re/lib/python2.7/site-packages/django/core/management/__init__.py", line 453, in execute_from_command_line
    utility.execute()
  File "/Users/Development/virtual-re/lib/python2.7/site-packages/django/core/management/__init__.py", line 392, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/Development/virtual-re/lib/python2.7/site-packages/django/core/management/__init__.py", line 272, in fetch_command
    klass = load_command_class(app_name, subcommand)
  File "/Users/Development/virtual-re/lib/python2.7/site-packages/django/core/management/__init__.py", line 77, in load_command_class
    module = import_module('%s.management.commands.%s' % (app_name, name))
  File "/Users/Development/virtual-re/lib/python2.7/site-packages/django/utils/importlib.py", line 35, in import_module
    __import__(name)
  File "/Users/Development/project/apps/action/management/commands/close_action.py", line 2, in <module>
    from action.models import CompanyAction
  File "/Users/Development/project/apps/action/models.py", line 26, in <module>
    from profile.models import Company
  File "/Users/Development/apps/profile/models.py", line 436, in <module>
    class CompanyReview(models.Model):
  File "/Users/Development/project/apps/profile/models.py", line 446, in CompanyReview
    action = models.ForeignKey(_model)
  File "/Users/Development/virtual-re/lib/python2.7/site-packages/django/db/models/fields/related.py", line 993, in __init__
    assert isinstance(to, six.string_types), "%s(%r) is invalid. First parameter to ForeignKey must be either a model, a model name, or the string %r" % (self.__class__.__name__, to, RECURSIVE_RELATIONSHIP_CONSTANT)
AssertionError: ForeignKey(None) is invalid. First parameter to ForeignKey must be either a model, a model name, or the string 'self'
(虚拟环境)PC:neurix$python manage.py关闭\u操作
回溯(最近一次呼叫最后一次):
文件“manage.py”,第10行,在
从命令行(sys.argv)执行命令
文件“/Users/Development/virtual re/lib/python2.7/site packages/django/core/management/_init__.py”,第453行,从命令行执行
utility.execute()
文件“/Users/Development/virtual-re/lib/python2.7/site-packages/django/core/management/__-init__.py”,第392行,在execute中
self.fetch_命令(子命令)。从_argv(self.argv)运行_
文件“/Users/Development/virtual re/lib/python2.7/site packages/django/core/management/_init__.py”,第272行,在fetch_命令中
klass=加载命令类(应用程序名称,子命令)
文件“/Users/Development/virtual-re/lib/python2.7/site-packages/django/core/management/_-init__.py”,第77行,加载命令类
模块=导入模块(“%s.management.commands.%s%”(应用程序名称,名称))
文件“/Users/Development/virtual re/lib/python2.7/site packages/django/utils/importlib.py”,第35行,在导入模块中
__导入(名称)
文件“/Users/Development/project/apps/action/management/commands/close_action.py”,第2行,在
从action.models导入CompanyAction
文件“/Users/Development/project/apps/action/models.py”,第26行,在
来自profile.models进口公司
文件“/Users/Development/apps/profile/models.py”,第436行,在
类别CompanyReview(models.Model):
文件“/Users/Development/project/apps/profile/models.py”,第446行,在CompanyReview中
action=models.ForeignKey(_model)
文件“/Users/Development/virtual re/lib/python2.7/site packages/django/db/models/fields/related.py”,第993行,在__
assert isinstance(到,六个.string类型),%s(%r)无效。ForeignKey的第一个参数必须是模型、模型名称或字符串%r“%(self.\uuuuuuuuu类\uuuuu.\uuuuuu名称\uuuuu,到,递归关系\u常量)
AssertionError:ForeignKey(无)无效。ForeignKey的第一个参数必须是模型、模型名称或字符串“self”

Django有一个系统,用于停止外键上的循环导入,详情如下:

您可能希望执行以下操作:

class CompanyReview(models.Model):
    company = models.ForeignKey(Company)
    action = models.ForeignKey('action.CompanyAction')

class CompanyAction(models.Model):
    company = models.ForeignKey('profile.Company', null = True, blank = True)

Django有一个停止外键循环导入的系统,详细说明如下:

您可能希望执行以下操作:

class CompanyReview(models.Model):
    company = models.ForeignKey(Company)
    action = models.ForeignKey('action.CompanyAction')

class CompanyAction(models.Model):
    company = models.ForeignKey('profile.Company', null = True, blank = True)

嗨,杰夫,谢谢你的回答!你的建议很有效。你知道为什么当我通过Web服务器执行站点时,它从来没有引起问题,而错误只是通过命令出现的吗?我不知道对不起:(我一直认为在Web服务器上运行时也会失败嗨Jeff,谢谢你的回答!你的建议很有效。你知道为什么我在Web服务器上执行站点时,它从来没有引起问题,错误只是通过命令出现的吗?我不知道抱歉:(我一直认为在运行Web服务器时也会失败