2012-04-18 2 views
9

Я написал эту несильно на utils.py находится на приложение direcroty:ошибка импорта на Джанго 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() 

Тогда, когда я использую функцию to_safe_uppercase на мой файл models.py, путем его импорта в таким образом:

from bm.bmApp.utils import to_safe_uppercase 

Я получил ошибку питона:

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

Я получил решение этой проблемы, когда я изменить т он импортировать заявление для:

from bm.bmApp.utils import * 

Но я не могу понять, почему это, почему, когда я импортировать определенную функцию я получил ошибку?

+0

Этого не должно быть. Я подозреваю, что происходит что-то еще. – Marcin

+0

К сожалению, django по умолчанию ловит ImportErrors и заменяет их этим errormessage. попробуйте исправить django, чтобы он дал вам трассировку, это должно указывать на проблему. Я подозреваю циклический импорт или что-то в этом роде. – ch3ka

+0

@ ch3ka patching django - отличная идея ... он уже получил трассировку питона. Конечно, он вставил часть его в вопрос – Jiaaro

ответ

0

Я не уверен, что могу объяснить ошибку импорта, но у меня есть три идеи. Во-первых, ваша функция нуждается в настройке. Вы использовали зарезервированное слово 'string' в качестве аргумента. Рассмотрим переименование.

Во-вторых, что произойдет, если вы вызываете ./manage.py оболочку и выполняете импорт вручную. Означает ли это что-то другое?

В-третьих, попробуйте удалить ваши PYC файлы, чтобы заставить Джанго перекомпилировать код питона (это один очень длинный выстрел ... но стоит исключая)

+0

Я думал, что это 'str' – Jiaaro

+0

Это ул. но строка является модулем в stdlib ... – ch3ka

7

Вы создаете круговой импорт.

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... 

Я хотел бы предложить свой реорганизовать код так, что вы не имеют циклическую зависимость (т.е. Utils не нужно импортировать models.py или наоборот).

+0

Почему это работает тогда, когда OP использует 'from ... import *'? – jadkik94

+0

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

+0

Спасибо. Вы должны подумать о том, чтобы добавить что-то об этом в свой ответ, это часть вопроса OP. :) – jadkik94

10

Вы выполняете так называемый циклический импорт.

models.py:

from bm.bmApp.utils import to_safe_uppercase 

utils.py:

from bm.bmApp.models import Client 

Теперь, когда вы import bm.bmApp.models интерпретатор выполняет следующие действия:

  1. models.py - Line 1: попробуйте импортировать bm.bmApp.utils
  2. utils.py - Line 1: попробуйте импортировать bm.bmApp.models
  3. models.py - Line 1: попробуйте импортировать bm.bmApp.utils
  4. utils.py - Line 1: попробуйте импортировать bm.bmApp.models
  5. ...

Самым простым решением является перемещение импорта внутри функции:

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() 
Смежные вопросы