2012-04-18 14 views
9

Escribí esta funcion en un utils.py situado en la direcroty aplicación:Error de importación de Django models.py

from bm.bmApp.models import Client 

def get_client(user): 
    try: 
     client = Client.objects.get(username=user.username) 
    except Client.DoesNotExist: 
     print "User Does not Exist" 
     return None 
    else:  
     return client 

def to_safe_uppercase(string): 
    if string is None: 
     return '' 
    return string.upper() 

A continuación, cuando se utiliza la función de to_safe_uppercase en mi archivo models.py, mediante su importación en de esta manera:

from bm.bmApp.utils import to_safe_uppercase 

me dio el error de pitón:

 from bm.bmApp.utils import to_safe_uppercase 
ImportError: cannot import name to_safe_uppercase 

tengo la solución para este problema cuando cambio t que importar declaración para:

from bm.bmApp.utils import * 

pero no puedo entender por qué es esto, ¿por qué al importar la función específica que me dieron el error?

+0

Esto no debería suceder. Sospecho que hay algo más en juego. – Marcin

+0

desafortunadamente, django detecta de manera predeterminada ImportErrors y los reemplaza con este mensaje de error. intente parchear django, de modo que le proporcione la trazabilidad, esto debería apuntar al problema. Sospecho importaciones cíclicas o algo así. – ch3ka

+0

@ ch3ka parches django no es una gran idea ... también está obteniendo el rastreo de python ya. Ha pegado una parte en la pregunta – Jiaaro

Respuesta

0

No estoy seguro de poder explicar el error de importación, pero tengo tres ideas. Primero, tu función necesita ajustes. Has usado una palabra reservada 'cadena' como argumento. Considera renombrar

En segundo lugar, ¿qué ocurre si invoca el shell ./manage.py y lo hace a mano? ¿Te da algo diferente?

tercer lugar, tratar de eliminar sus archivos pyc para forzar Django recompilar el código Python (éste es un tiro muy largo ... pero vale la pena la eliminación)

+0

Pensé que era 'str' – Jiaaro

+0

Es str. pero string es un módulo en stdlib ... – ch3ka

7

Usted está creando una importación circular.

utils.py 
from bm.bmApp.models import Client 
# Rest of the file... 

models.py 
from bm.bmApp.utils import to_safe_uppercase 
# Rest of the file... 

que sugeriría su refactorizar su código para que usted no tiene una dependencia circular (es decir, utilidades no deberían tener que importar models.py o viceversa).

+0

¿Por qué funciona entonces cuando el OP usa 'from ... import *'? – jadkik94

+0

Consulte http://docs.python.org/faq/programming.html#what-are-the-best-practices-for-using-import-in-a-module –

+0

Gracias. Debería considerar agregar algo al respecto en su respuesta, es parte de la pregunta del OP. :) – jadkik94

10

Realiza lo que se conoce como importación circular.

models.py:

from bm.bmApp.utils import to_safe_uppercase 

utils.py:

from bm.bmApp.models import Client 

Ahora cuando haces import bm.bmApp.models El intérprete hace lo siguiente:

  1. models.py - Line 1: tratar de importar bm.bmApp.utils
  2. utils.py - Line 1: intenta importar bm.bmApp.models
  3. models.py - Line 1: tratar de importar bm.bmApp.utils
  4. utils.py - Line 1: tratar de importar bm.bmApp.models
  5. ...

La solución más fácil es mover la importación dentro de la función:

utils.py:

def get_client(user): 
    from bm.bmApp.models import Client 
    try: 
     client = Client.objects.get(username=user.username) 
    except Client.DoesNotExist: 
     print "User Does not Exist" 
     return None 
    else:  
     return client 

def to_safe_uppercase(string): 
    if string is None: 
     return '' 
    return string.upper() 
Cuestiones relacionadas