Django 无法导入名称 x。

55

我遇到了一个我不理解的错误!

无法导入Item名称

在我的模型中,我有物品。这些物品对于执行某些操作是必需的。但其中一些物品会影响操作:

items

from django.db import models
from effects.models import Effect

class Type(models.Model):
    name = models.CharField(max_length=200)

    def __unicode__(self):
         return self.name

class Item(models.Model):
    name = models.CharField(max_length=200)
    description = models.CharField(max_length=200)
    type = models.ForeignKey(Type)
    quality = models.IntegerField()
    effects = models.ManyToManyField(Effect,through='ItemEffect',blank=True)
    item_requirement = models.ManyToManyField('self',through='ItemCraft',symmetrical=False,blank=True)
points = models.IntegerField()

    def __unicode__(self):
        return self.name

class Food(Item):
    ap = models.IntegerField()

class Tool(Item):
    durability = models.IntegerField()

[....]

class ItemEffect(models.Model):
    item = models.ForeignKey(Item)
    effect = models.ForeignKey(Effect)

def __unicode__(self):
    return self.item.name+':'+str.lower(self.effect.name)

class Meta:
    verbose_name_plural = 'items effects'

class ItemCraft(models.Model):
    item = models.ForeignKey(Item,related_name='%(class)s_item_crafted')
    item_requirement = models.ForeignKey(Item,related_name='%(class)s_item_required')
    number = models.IntegerField()

    def __unicode__(self):
        return self.item.name+' requires '+str.lower(self.item.name)+'('+self.number+')'

    class Meta:
        verbose_name_plural = 'items crafts'

操作

from django.db import models
from items.models import Item

class Action(models.Model):
    name = models.CharField(max_length=200)
    description = models.CharField(max_length=200)
    pa = models.IntegerField()

    def __unicode__(self):
        return self.name

class CraftAction(Action):
    item = models.ForeignKey(Item)

    def __unicode__(self):
        return self.item.name+'\'s craft'

    class Meta:
        verbose_name_plural = 'crafts actions'

影响(effects)

from django.db import models
from actions.models import Action

class Effect(models.Model):
    action = models.ForeignKey

class ApEffect(Effect):
    ap = models.IntegerField()

这个包含这些模型的“app”文件夹的名称叫做“items”吗? - imm
@pppery 循环导入Django模型是一个独立的问题。这个问题有一个特定于Django的答案。这不是重复的。 - Max Malysh
5个回答

103

你的代码存在循环导入,这就是为什么在操作中无法导入Item的原因。

您可以通过从一个文件中删除类的导入并将其替换为包含类名称的字符串(如文档中所述)来解决该问题。例如:

effects = models.ManyToManyField('effects.Effect',through='ItemEffect',blank=True)

非常感谢 =)我知道这个错误,但不知道如何解决它! - Cyril F
2
我已经寻找很久为什么我的导入无法正常工作的原因了。 - Robert Johnstone
非常好 :)。谢谢 - Palomita Yañez Quiroz

31

像madjar建议的那样,你的代码中可能存在循环导入。如果你无法找出循环的位置(涉及哪些模块和导入),你可以使用traceback选项来了解问题所在的大致位置:

python manage.py validate --traceback

编辑 - 验证(Validate)在Django 1.7版本中已被弃用。因此,请运行以下命令 -

python manage.py check --traceback

这对我解决了问题。我也遇到了“无法导入名称Item”的错误。然而,在我的情况下,我在models.py文件中定义了一个名为Item的模型。我删除了这些模型并重新开始定义。使用manage.py sqlclear app并不能解决它。删除.pyc文件并重新启动服务器解决了问题。 - frishi
1
值得一看的是 .pyc 文件是什么:https://dev59.com/6moy5IYBdhLWcg3wBJgx - frishi

10

尝试将模型本地导入而不是作为公共模型进行导入,例如:

def sample_function():
    from effects.models import Effect # import within function or class

或者导入模型作为字符串 -> 'APP_NAME.MODEL_NAME'

pay_methods = models.ManyToManyField('payment_app.AllowedPayMethod')

10

这是我在谷歌上找到的第一篇文章,所以我会发布这个错误的替代原因。

在我的代码中没有循环导入,我通过手动删除项目中所有的.pyc文件来解决这个问题。显然,重新启动应用程序并没有重新编译我的代码。


0

类似于Pythonator的情况 - 我遇到了同样错误信息的另一种原因。

在我的情况下,我忘记激活为我的项目设置的虚拟环境,并尝试运行服务器。在激活环境并再次运行服务器后,我没有遇到任何问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接