2012-04-18 48 views
9

tôi đã viết funcion này trên một utils.py nằm trên direcroty ứng dụng:lỗi nhập khẩu đối với 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() 

Sau đó, khi tôi sử dụng các chức năng to_safe_uppercase trong hồ sơ models.py tôi, bằng cách nhập nó trong theo cách này:

from bm.bmApp.utils import to_safe_uppercase 

tôi đã nhận lỗi python:

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

tôi có giải pháp cho vấn đề này khi tôi thay đổi t ông nhập tuyên bố cho:

from bm.bmApp.utils import * 

Nhưng tôi không thể hiểu tại sao điều này, tại sao khi tôi nhập chức năng cụ thể tôi đã nhận được lỗi?

+0

Điều này không nên xảy ra. Tôi nghi ngờ có cái gì đó khác đang xảy ra. – Marcin

+0

không may, django theo mặc định bắt ImportErrors và thay thế chúng bằng lỗi này. cố gắng vá django, để nó mang lại cho bạn traceback, điều này sẽ chỉ ra vấn đề. Tôi nghi ngờ nhập khẩu cyclic hoặc một cái gì đó như thế. – ch3ka

+0

@ ch3ka vá django không phải là một ý tưởng tuyệt vời ... anh ấy cũng đang nhận được traceback trăn rồi. Ông đã dán một phần của nó trong câu hỏi – Jiaaro

Trả lời

0

Tôi không chắc mình có thể giải thích lỗi Nhập nhưng tôi có ba ý tưởng. Đầu tiên, chức năng của bạn cần tinh chỉnh. Bạn đã sử dụng từ dành riêng 'chuỗi' làm đối số. Xem xét đổi tên.

Thứ hai, điều gì xảy ra nếu bạn gọi ./manage.py shell và thực hiện nhập bằng tay. Nó có mang lại cho bạn sự khác biệt nào không?

Thứ ba, cố gắng xóa các tập tin của bạn PYC để buộc django để biên dịch lại mã python (cái này là một shot rất dài ... nhưng giá trị loại bỏ)

+0

Tôi nghĩ đó là 'str' – Jiaaro

+0

Nó là str. nhưng chuỗi là một mô-đun trong stdlib ... – ch3ka

7

Bạn đang tạo một khẩu tròn.

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

Tôi khuyên bạn nên refactor mã của bạn để bạn không có phụ thuộc vòng tròn (tức là utils không cần nhập models.py hoặc ngược lại).

+0

Tại sao nó hoạt động sau đó khi OP sử dụng 'từ ... import *'? – jadkik94

+0

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

+0

Cảm ơn. Bạn nên cân nhắc việc thêm một cái gì đó về nó trong câu trả lời của bạn, đó là một phần của câu hỏi của OP. :) – jadkik94

10

Bạn đang làm cái được gọi là nhập Thông tư.

models.py:

from bm.bmApp.utils import to_safe_uppercase 

utils.py:

from bm.bmApp.models import Client 

Bây giờ khi bạn làm import bm.bmApp.models Các thông dịch nào sau đây:

  1. models.py - Line 1: cố gắng nhập bm.bmApp.utils
  2. utils.py - Line 1: cố gắng nhập bm.bmApp.models
  3. models.py - Line 1: cố gắng nhập bm.bmApp.utils
  4. utils.py - Line 1: cố gắng nhập bm.bmApp.models
  5. ...

Giải pháp đơn giản nhất là để di chuyển nhập khẩu bên trong hàm:

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() 
Các vấn đề liên quan