Django-fr

Forum

#1 06-10-2011 13:33:01

kyrillos
Membre
Inscription : 22-06-2011
Messages : 10

cannot import name X

J'ai une erreur cannot import name Item que je ne comprend pas.

Dans mon modèle, j'ai des items. Ces items sont nécessaire pour certaines actions. Mais certains (autres) items ont un effet sur les actions.

items

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'

actions

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'

effects

from django.db import models
from actions.models import Action

class Effect(models.Model):
    action = models.ForeignKey(Action)
   
class ApEffect(Effect):
    ap = models.IntegerField()

Dernière modification par kyrillos (07-10-2011 09:39:04)

Hors ligne

#2 07-10-2011 09:40:25

kyrillos
Membre
Inscription : 22-06-2011
Messages : 10

Re : cannot import name X

Pour résoudre mon problème de dépendance (importation circulaire) :

effects

from django.db import models

class Effect(models.Model):
    action = models.ForeignKey('actions.Action')
   
class ApEffect(Effect):
    ap = models.IntegerField()

Hors ligne

#3 07-10-2011 10:26:05

SBillion
Membre
Lieu : grenoble
Inscription : 05-08-2011
Messages : 43
Site Web

Re : cannot import name X

Je pense que c'est simplement parce que Item a un manyToMany vers
Effect. Mais Effect a une foreignKey vers Action. Tu essaies d'import
Item dans Action alors qu'Item ne peut pas être créer sans Action. En
gros dans item tu import Effect et implicitement, tu importe aussi
Action puisque Action est utilisé par Effect. Je ne sais pas si cela et
très claire dis comme ça, mais en gros tu as créé une espèce de boucle
impossible à interpréter pour python.
Après je fais peut-être fausse route, je suis un peu empatté ce matin.


BILLION Sébastien

the Answer to the ultimate question of life, the universe and everything
is 42

http://www.sebastienbillion.com/ <http://www.sebastienbillion.com/>

Le 06/10/2011 14:33, kyrillos a écrit :
> J'ai une erreur cannot import name Item que je ne comprend pas
>
> [h]items[/h]
>
> 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'
>
> [h]actions[/h]
>
> 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'
>
> [h]effects[/h]
>
> from django.db import models
> from actions.models import Action
>
> class Effect(models.Model):
>      action = models.ForeignKey
>
>      class Meta:
>          abstract = True
>
> class ApEffect(Effect):
>      ap = models.IntegerField()
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django

Hors ligne

Pied de page des forums