Django - 循环模型导入问题

11 浏览
0 Comments

Django - 循环模型导入问题

我真的不太理解这个,所以如果有人能解释一下这个是如何工作的,我会非常感激。我有两个应用程序,Accounts和Theme...这是我的设置列表:

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)

而在我的theme模型中:

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

这是某种循环导入的问题吗?我尝试过使用延迟引用,但似乎也不起作用!

0
0 Comments

在Django中,当在一个应用程序的模型中引用另一个应用程序的模型时,需要注意ForeignKey字段内部的字符串的正确格式。这个字符串应该是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和stackoverflow也没有提供帮助(所有的例子都是单个组件的应用程序路径),所以希望这能帮助其他Django新手。

0
0 Comments

Django - 循环模型导入问题

在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及以上的版本中,可以使用django.apps中的apps.get_model函数来实现延迟模型导入。具体代码如下:

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

在Django 1.7及以上版本中,可以使用apps.get_model(app_label, model_name)或apps.get_model('app_label.model_name')来实现延迟模型导入。

可以在Django 1.7+的官方文档中找到更多关于apps.get_model的信息。

可以确认这种方法在Django 3.2+版本中仍然适用。

0
0 Comments

问题原因:在Django中,循环导入是指两个或多个模块相互导入对方,从而导致导入错误。在这个问题中,出现循环导入的原因是在导入Theme模型时出现了错误。

解决方法:将导入语句中的Theme替换为字符串形式的模型名称。

具体代码如下:

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

需要注意的是,Theme模型所在的应用与当前应用不同,因此应该使用完整的模型路径来进行导入,即'themes.Theme'。

最终,这样修改后的代码可以解决循环导入的问题,并且在性能方面只会有一点点的损耗,但只会发生一次。

0