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() 

Django正在踢出以下错误:

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

这是一种循环import问题吗? 我试过使用懒惰的引用,但似乎并不工作!

删除Theme的导入,并使用模型名称作为string。

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

我没有看到足够详细的任何地方提到的是如何正确地在不同的应用程序中引用模型时在ForeignKey中形成string。 这个string需要是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 )之前,我偶然发现,谷歌/ SO没有帮助(所有的例子有单组件应用程序path),所以希望这将有助于其他Django的新手。

使用专为懒惰模型导入而devise的django.db.models中的get_model函数:

 MyModel = get_model('app_name', 'ModelName') 

在你的情况下:

 Theme = get_model('themes', 'Theme') 

现在你可以使用Theme

由于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