Django-循环模型导入问题

Django-循环模型导入问题,django,django-models,Django,Django Models,我真的不明白,所以如果有人能解释这是怎么回事,我会非常感激。我有两个应用程序,帐户和主题。。。这是我的设置列表: INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'accounts', 'themes', ) 在accounts中,我正在尝试这

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

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'accounts',
    'themes',
)
在accounts中,我正在尝试这样做:

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 = models.ForeignKey('themes.Theme')

在其他应用程序中引用模型时,如何正确地在ForeignKey中表示字符串,这是我在任何地方都没有看到的。此字符串必须是
app\u label.model\u name
。而且,非常重要的是,
app\u标签
并不是已安装的应用程序的全部,而只是其中的最后一个组件。因此,如果您安装的应用程序如下所示:

INSTALLED_APPS = (
...
    'path.to.app1',
    'another.path.to.app2'
)
from django.apps import apps

YourModel = apps.get_model('your_app_name', 'YourModel')
然后,要在app1模型中包含app2中模型的ForeignKey,必须执行以下操作:

app2_themodel = ForeignKey('app2.TheModel')

我花了相当长的时间试图解决一个循环导入问题(因此我不能从另一个.path.to.app2.models导入模型),在我无意中发现这个问题之前,google/so没有帮助(所有示例都有单组件应用程序路径),所以希望这能帮助其他django新手。

到django 1.7:

from django.apps import apps
apps.get_model('app_label.model_name')
使用
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')
现在您可以使用
主题

对于Django 1.7+:

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

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

INSTALLED_APPS = (
...
    'path.to.app1',
    'another.path.to.app2'
)
from django.apps import apps

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

请参阅:

这看起来确实像是循环导入的问题。为什么需要从定义了主题的模块中导入帐户?对不起,我没有正确粘贴主题模型,我已经更新了帖子。我在样式表类中使用它。实际上,它需要是
“themes.Theme”
,因为它在另一个应用程序中。啊,这很有效,我以前只是尝试“Theme”,但它不起作用。谢谢这样做是否会对性能造成影响?如果可能的话,我想保持我的查找不偷懒:)@Daniel:Updated@韩盼:是的,一个小的。但只能使用一次。使用
apps.get\u model(app\u label,model\u name)
apps.get\u model('app\u label.model\u name')
还有一个参数快捷语法:
apps.get\u model('your\u app\u name.YourModel')
方便在
地图中使用。