2011-10-07 59 views
34

我收到一个错误,我不明白!Django无法导入名称x

不能导入名称项目

在我的模型,我有一个项目。这些项目是操作所必需的。但是,一些这些项目都对行为的影响:

项目

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() 
+0

包含这些模型的“app”文件夹的名称是“items”吗? – imm

回答

69

代码中有一个循环导入,这就是为什么无法导入该项目的原因。

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

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

非常感谢你=)我认为这个错误,但我不知道如何解决它! –

+2

我一直在寻找我的进口不适合年龄的原因 – Sevenearths

25

像madjar建议,有可能在你的代码中的圆形进口。如果您无法找出其中的圆(哪些模块和进口都参与),您可以使用追溯选项来获得的问题所在了一个想法:

python manage.py validate --traceback 
+0

这解决了我的问题。我得到相同的“无法导入名称项”错误。然而在我的例子中,我有一个名为Item的模型,在我的models.py文件中定义。我删除了这些模型,并重新开始了新的定义。做一个'manage.py sqlclear应用程序'没有解决它。删除.pyc文件并重新启动服务器修复了它。 – frishi

+1

值得一看.pyc文件是:http://stackoverflow.com/questions/8822335/what-the-different-python-file-extensions-stand-for – frishi

6

这是第一个职位,来到谷歌,所以我会发布这个错误的替代原因。

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

0

与Pythonator类似的情况 - 我有相同的错误信息的替代原因。

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