我真的不明白这一点,所以如果有人能解释这是如何工作的,我将非常感激。我有两个应用程序,帐户和主题...这是我的设置列表:
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()
Django 正在排除以下错误:
from themes.models import Theme
ImportError: cannot import name Theme
这是某种循环导入问题吗?我尝试过使用惰性引用,但这似乎也不起作用!
Theme
的模块中导入 Account
?
删除 Theme
的导入并改用模型名称作为字符串。
theme = models.ForeignKey('themes.Theme')
到 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')
我在任何地方都没有看到足够详细的内容是如何在引用不同应用程序中的模型时正确地制定 ForeignKey 中的字符串。此字符串必须为 app_label.model_name
。而且,非常重要的是,app_label
不是 INSTALLED_APPS 中的整行,而只是它的最后一个组件。因此,如果您的 INSTALLED_APPS 看起来像这样:
INSTALLED_APPS = (
...
'path.to.app1',
'another.path.to.app2'
)
然后要将 ForeignKey 包含到 app1 模型中的 app2 中的模型中,您必须执行以下操作:
app2_themodel = ForeignKey('app2.TheModel')
在我偶然发现这个问题之前,我花了很长时间试图解决一个循环导入问题(所以我不能只是 from another.path.to.app2.models import TheModel
),google/SO 没有帮助(所有示例都有单组件应用程序路径),所以希望这个将帮助其他 django 新手。
由于 Django 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
apps.get_model('your_app_name.YourModel')
方便在 map
等中使用。
我遇到了同样的问题,但在使用 MyModel = get_model('app_name', 'ModelName')
时出现新错误 'raise AppRegistryNotReady("Models aren't loaded yet.")'
我尝试了此页面上的所有其他方法,但没有一个对我有用。我修复它的方法是使用:MyModel = get_model('app_name', 'ModelName')
,但实际上是在课堂上而不是在课堂外。
from django.apps import apps
然后我定义了一个保存方法,里面有: Cart = apps.get_model(app_label='Carts', model_name='Cart')
这允许我从其他地方导入另一个 django 模型。
这就是我通过指定 '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',...)
不定期副业成功案例分享
'themes.Theme'
,因为它在不同的应用程序中。