Django 无法导入名称 x
我遇到了一个我不明白的错误!
无法导入名称 Item
在我的模型中,我有一些物品。这些物品是执行某些操作所必需的。但其中一些物品会对这些操作产生影响:
物品
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 个回答
10
这是我在谷歌上找到的第一个帖子,所以我想分享一下这个错误的另一种可能原因。
在我的代码里并没有循环导入的问题,我是通过手动删除项目中的所有 .pyc 文件来解决这个问题的。显然,重启应用并没有重新编译我的代码。
31
就像madjar提到的,你的代码里可能有循环导入的问题。如果你找不到这个循环在哪里(哪些模块和导入涉及其中),你可以使用追踪选项来了解问题出在哪里:
python manage.py validate --traceback
补充一下 - 从django 1.7开始,Validate这个功能已经不再推荐使用了。所以请运行以下命令 -
python manage.py check --traceback
103
你的代码中有一个循环导入的问题,这就是为什么在操作中无法导入Item的原因。
你可以通过去掉其中一个文件里对某个类的导入,然后用一个包含该类名称的字符串来替代,来解决这个问题,就像文档中解释的那样。比如:
effects = models.ManyToManyField('effects.Effect',through='ItemEffect',blank=True)