Django-循环模式导入问题

我真的不明白,所以如果有人能解释一下这是怎么回事,我会非常感激的。我有两个应用程序,帐户和主题... 这是我的设置列表:

INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'accounts',
'themes',
)

在账户方面,我正在努力做到这一点:

from themes.models import Theme


class Account(models.Model):
ACTIVE_STATUS = 1
DEACTIVE_STATUS = 2
ARCHIVE_STATUS = 3
STATUS_CHOICES = (
(ACTIVE_STATUS, ('Active')),
(DEACTIVE_STATUS, ('Deactive')),
(ARCHIVE_STATUS, ('Archived')),
)


id = models.AutoField(primary_key=True)
name = models.CharField(max_length=250)
slug = models.SlugField(unique=True, verbose_name='URL Slug')
status = models.IntegerField(choices=STATUS_CHOICES, default=ACTIVE_STATUS, max_length=1)
owner = models.ForeignKey(User)
enable_comments = models.BooleanField(default=True)
theme = models.ForeignKey(Theme)
date_created = models.DateTimeField(default=datetime.now)

在我的主题模型里:

class Theme(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=250)
slug = models.SlugField(unique=True, verbose_name='URL Slug')
date_created = models.DateTimeField(default=datetime.now)


class Stylesheet(models.Model):
id = models.AutoField(primary_key=True)
account = models.ForeignKey(Account)
date_created = models.DateTimeField(default=datetime.now)
content = models.TextField()

姜戈正在剔除以下错误:

from themes.models import Theme
ImportError: cannot import name Theme

这是某种循环进口问题吗?我试过使用一个懒惰的引用,但似乎也不起作用!

70506 次浏览

删除 Theme的导入,改为使用模型名作为字符串。

theme = models.ForeignKey('themes.Theme')

我在任何地方都没有看到足够详细的内容,那就是如何在不同的应用程序中引用模型时正确地表述 ForeignKey 中的字符串。这个字符串需要是 app_label.model_name。而且,非常重要的是,app_label不是 INSTALLED _ APPS 中的整行,而只是它的 最后一部分。因此,如果您的 INSTALLED _ APPS 看起来像这样:

INSTALLED_APPS = (
...
'path.to.app1',
'another.path.to.app2'
)

然后,为了在 app1模型中的 app2中包含一个模型的 ForeignKey,你必须这样做:

app2_themodel = ForeignKey('app2.TheModel')

我花了相当长的时间试图解决一个循环导入问题(所以我不能只 from another.path.to.app2.models import TheModel)之前,我偶然发现,google/SO 没有帮助(所有的例子都有单组件的应用程序路径) ,所以希望这将有助于其他 django 新手。

升级到姜戈1.7:

使用 django.db.models中的 get_model函数,它是为延迟模型导入而设计的:

from django.db.models import get_model
MyModel = get_model('app_name', 'ModelName')

就你而言:

from django.db.models import get_model
Theme = get_model('themes', 'Theme')

现在可以使用 Theme

对于 Django 1.7 + :

from django.apps import apps
apps.get_model('app_label.model_name')

因为姜戈1.7的正确方法是这样的:

from django.apps import apps


YourModel = apps.get_model('your_app_name', 'YourModel')

见: https://docs.djangoproject.com/ja/1.9/ref/applications/#django.apps.apps.get_model

我有同样的问题,但在使用 MyModel = get_model('app_name', 'ModelName')我得到了一个新的错误 'raise AppRegistryNotReady("Models aren't loaded yet.")'

我尝试了这页上所有其他的方法,但没有一个对我有用。 我修理它的方法是: MyModel = get_model('app_name', 'ModelName') 但实际上是在课堂上而不是课外。

这就是我通过指定‘ app _ name. model _ name’和 TYPE _ CHECKING 修复循环问题的方法

profile app's models.py
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from team.models import Team


team = models.ForeignKey('team.Team',...)


team app's models.py
Class Team
name = models.CharField(...)
head = models.ForeignKey('profile.Profile',...)