Django-循环模型导入问题


115

我真的没有得到这个,所以如果有人可以解释它是如何工作的,我将非常感激。我有两个应用程序,“帐户”和“主题” ...这是我的设置列表:

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
它看起来确实像是循环导入的问题。为什么需要AccountTheme定义的模块中导入?
多米尼克·罗杰

抱歉,我没有正确粘贴主题模型,我已经更新了我的帖子。我在Stylesheet类中使用它。
汉班

Answers:


212

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

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

5
实际上,它需要是'themes.Theme',因为它在另一个应用程序中。
丹尼尔·罗斯曼

嗯,行得通,我之前只是尝试“主题”,但行不通。谢谢。这样做会对性能产生影响吗?如果可能的话,我想让我的查询保持不懒惰:)
Hanpan 2010年

@Daniel:更新。@韩盼:一个很小的,是的。但是只有一次。
伊格纳西奥·巴斯克斯

56

直到Django 1.7:

使用get_model功能由django.db.models这是专为懒人模式:进口

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

10
使用apps.get_model(app_label, model_name)apps.get_model('app_label.model_name') 在Django 1.7+
phoibos

51

在其他应用程序中引用模型时,如何在外部关键字中正确地表达字符串,这是我至今未曾详细提及的。该字符串必须为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新手。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.