Django无法导入名称x

时间:2011-10-07 07:46:51

标签: python django django-models

我收到了一个我不明白的错误!

无法导入名称项

在我的模特中,我有物品。这些项目是行动所必需的。但其中一些项目会对行动产生影响:

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'

效果

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

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

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

5 个答案:

答案 0 :(得分:79)

您的代码中存在循环导入,这就是无法导入Item的原因。

您可以通过删除其中一个文件中的类的导入,并将其替换为包含类名as explained in the documentation的字符串来解决此问题。例如:

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

答案 1 :(得分:27)

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

python manage.py validate --traceback

答案 2 :(得分:8)

这是Google上发布的第一篇文章,因此我将发布此替代错误原因。

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

答案 3 :(得分:5)

尝试在本地导入模型,而不是作为公共模型导入示例

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

答案 4 :(得分:0)

与Pythonator类似的情况 - 我有另一个原因导致相同的错误消息。

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