web-dev-qa-db-fra.com

Django ne peut pas importer le nom x

J'ai une erreur que je ne comprends pas!

je ne peux pas importer le nom Item

Dans mon modèle, j'ai des articles. Ces éléments sont requis pour les actions. Mais certains de ces éléments ont un effet sur les actions:

articles

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'

actes

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'

effets

from Django.db import models
from actions.models import Action

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

class ApEffect(Effect):
    ap = models.IntegerField()
41
Cyril F

Il y a une importation circulaire dans votre code, c'est pourquoi l'élément ne peut pas être importé en action.

Vous pouvez résoudre le problème en supprimant l'importation d'une classe dans l'un de vos fichiers et en le remplaçant par une chaîne contenant le nom de la classe, comme expliqué dans la documentation . Par exemple :

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

Comme suggéré par madjar, il y a probablement une importation circulaire dans votre code. Si vous ne parvenez pas à savoir où se trouve le cercle (quels modules et quelles importations sont impliquées), vous pouvez utiliser l'option traceback pour avoir une idée de l'endroit où se situe le problème:

python manage.py validate --traceback
27
Ciske Boekelo

Il s’agissait du premier message publié sur Google. Je vais donc publier cette autre cause d’erreur.

Dans mon code, il n'y avait aucune importation circulaire, j'ai résolu ce problème en supprimant manuellement tous les fichiers .pyc de mon projet. Apparemment, le redémarrage de l'application ne recompilait pas mon code.

8
Pythonator

Essayez d'importer localement votre modèle au lieu d'un modèle public, Exemple

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

Situation similaire à Pythonator - J'ai eu une autre cause pour le même message d'erreur.

Dans mon cas, j'avais oublié d'activer l'environnement virtuel que j'avais configuré pour mon projet et j'essayais de faire fonctionner le serveur. Après avoir activé l'environnement et relancé le serveur, je n'ai rencontré aucun problème.

0
Jonathan Porter