2010-12-07 81 views
77

我真的没有得到这个,所以如果有人可以解释这是如何工作的,我会非常感激。我有两个应用程序,帐户和主题...这里是我的设置列表: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 

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

+1

看起来像循环导入问题。你为什么需要从定义了`Theme`的模块导入`Account`? – 2010-12-07 16:34:32

+0

对不起,我没有正确粘贴主题模型,我更新了我的帖子。我在Stylesheet类中使用它。 – Hanpan 2010-12-07 16:35:42

回答

137

删除导入Theme,并将该型号名称用作字符串。

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

实际上,这需要是“themes.Theme'`,因为它在不同的应用程序中。 – 2010-12-07 16:45:44

+0

啊,这工作,我只是在'主题'之前,它没有工作。谢谢。这样做会有什么样的表现吗?如果可能,我希望保持查找不延迟:) – Hanpan 2010-12-07 16:47:31

+0

@Daniel:已更新。 @韩盘:小一点,是的。但只有一次。 – 2010-12-07 16:51:54

44

东西我还没有看到足够详细的任何地方提到的是如何在不同的应用程序引用模型时正确制定内部ForeignKey的字符串。该字符串需要为app_label.model_name。而且,非常重要的是,app_label并不是INSTALLED_APPS中的整个行,而只是它的最后一个组件。所以,如果你的INSTALLED_APPS看起来是这样的:

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

然后包括一个ForeignKey到APP2在APP1模型的模型,你必须做到:

app2_themodel = ForeignKey('app2.TheModel') 

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

34

使用get_model功能是专为懒人模式:进口

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

你的情况:

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

现在你可以使用Theme