Джанго не может импортировать имя х - PullRequest
45 голосов
/ 07 октября 2011

Я получил ошибку, которую не понимаю!

не может импортировать имя 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 ]

83 голосов
/ 07 октября 2011

В вашем коде есть циклический импорт, поэтому элемент не может быть импортирован в действии.

Вы можете решить эту проблему, удалив импорт класса в одном из ваших файлов и заменив его строкой, содержащей имя класса , как описано в документации . Например:

effects = models.ManyToManyField('effects.Effect',through='ItemEffect',blank=True)
28 голосов
/ 03 мая 2013

Как и предполагал маджар, в вашем коде, вероятно, есть циклический импорт. Если вам не удается определить, где находится круг (какие модули и импорт задействованы), вы можете использовать опцию traceback, чтобы получить представление о том, в чем проблема:

python manage.py validate --traceback
8 голосов
/ 28 мая 2013

Это было первое сообщение, появившееся в Google, поэтому я опубликую альтернативную причину ошибки.

В моем коде не было циклического импорта, я решил эту проблему, вручную удалив все файлы .pyc вмой проект.Очевидно, перезапуск приложения не перекомпилировал мой код.

7 голосов
/ 22 июня 2018

Попробуйте импортировать локально вашу модель вместо общедоступной, пример

def sample_function():
    from effects.models import Effect # import within function or class
0 голосов
/ 11 января 2018

Аналогичная ситуация с Pythonator - у меня была альтернативная причина для того же сообщения об ошибке.

В моем случае я забыл активировать виртуальную среду, которую я настроил для своего проекта, и пытался запустить сервер. После активации среды и повторного запуска сервера у меня не возникло проблем.

...