Django无法导入名称x。

11 浏览
0 Comments

Django无法导入名称x。

这个问题已经有答案了:

关于\"ImportError: 无法导入名称X\"或\"AttributeError:...(很可能因为循环导入)\",我该怎么办?

我看不懂出现了什么错误!

无法导入名称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()

admin 更改状态以发布 2023年5月23日
0
0 Comments

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

python manage.py validate --traceback

编辑 - 验证从django 1.7已经被弃用了。因此,请运行以下命令 -

python manage.py check --traceback

0
0 Comments

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

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

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

0