2011-10-07 25 views
34

¡Tengo un error que no entiendo!Django no puede importar el nombre x

no puede importar Nombre del artículo

En mi modelo, no tengo elementos. Estos elementos son necesarios para las acciones. Sin embargo, algunos de estos artículos tienen un efecto sobre las acciones:

artículos

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' 

acciones

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' 

efectos

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

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

class ApEffect(Effect): 
    ap = models.IntegerField() 
+0

¿El nombre de la carpeta de la "aplicación" que contiene estos modelos se llama "elementos"? – imm

Respuesta

69

Hay una importación circular en su código, es por eso que el artículo no se puede importar en acción.

Puede resolver el problema eliminando la importación de una clase en uno de sus archivos y reemplazándola por una cadena que contenga el nombre de la clase, as explained in the documentation. Por ejemplo:

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

Muchas gracias =) ¡Pensé en este error pero no sabía cómo resolverlo! –

+2

He estado buscando una razón por la cual mis importaciones no funcionaban para las edades – Sevenearths

25

Como se sugirió madjar, es probable que haya una importación circular en su código. Si usted está teniendo problemas para encontrar el origen del círculo es (qué módulos y las importaciones están involucrados), puede utilizar la opción de rastreo para tener una idea de dónde está el problema:

python manage.py validate --traceback 
+0

Esto resolvió el problema para mí. Obtenía el mismo error de "No se puede importar el elemento del nombre". En mi caso, sin embargo, tenía un modelo llamado Item definido en mi archivo models.py. Eliminé esos modelos y empecé de nuevo con nuevas definiciones. Hacer una aplicación 'manage.py sqlclear' no lo resolvió. Eliminar los archivos .pyc y reiniciar el servidor lo solucionó. – frishi

+1

Merece la pena ver qué archivos .pyc son: http://stackoverflow.com/questions/8822335/what-the-different-python-file-extensions-stand-for – frishi

6

Este fue el primer mensaje que apareció en Google, así que publicaré esta causa alternativa de error.

En mi código no había importaciones circulares, resolví este problema borrando manualmente todos los archivos .pyc en mi proyecto. Al parecer, reiniciar la aplicación no fue recompilar mi código.

0

Situación similar a Pythonator: tuve una causa alternativa para el mismo mensaje de error.

En mi caso, había olvidado activar el entorno virtual que configuré para mi proyecto e intentaba ejecutar el servidor. Después de activar el entorno y volver a ejecutar el servidor, no tuve problemas.

Cuestiones relacionadas