2014-08-31 77 views
1

我的工作區和任務的藍圖與工作區工作區/ apis.py和任務視圖任務/ apis.py瓶瓶進口錯誤

我想在工作區/ apis.py任務模型導入任務類,但我不能。

工作空間模型:

class Workspace(db.Model): 
    __tablename__ = 'workspace' 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.Unicode(50), nullable=False) 
    created_on = db.Column(db.DateTime, default=datetime.utcnow) 
    users = db.relationship('User', secondary=workspace_users, 
         backref=db.backref('workspaces', lazy='dynamic'),  lazy='dynamic') 
    owners = db.relationship('User', secondary=workspace_owners, 
         backref=db.backref('own_workspaces', lazy='dynamic'), lazy='dynamic') 
    teams = db.relationship('Team', cascade="all,delete", backref='workspace', lazy='dynamic') 
    projects = db.relationship('Project', cascade="all,delete", backref='workspace', lazy='dynamic') 
    tags = db.relationship('Tag', cascade="all,delete", backref='workspace', lazy='dynamic') 
    user_costs = db.relationship('UserRate', backref='workspace', lazy='dynamic') 
    clients = db.relationship('Client', backref='workspace', lazy='dynamic') 

和任務模式:

class Task(db.Model): 
    __tablename__ = 'task' 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.Unicode(120), nullable=False) 
    start_time = db.Column(db.DateTime, default=datetime.datetime.utcnow) 
    end_time = db.Column(db.DateTime) 
    second = db.Column(db.Integer) 
    rate = db.Column(db.Float) 
    status = db.Column(db.Boolean, default=True) 
    project_id = db.Column(db.Integer, db.ForeignKey('project.id')) 
    owner_id = db.Column(db.Integer, db.ForeignKey('user.id')) 
    tags = db.relationship('Tag', secondary=task_tag, 
          backref=db.backref('tasks', lazy='dynamic'), lazy='dynamic') 

在任務視圖我可以導入工作空間類,但在工作區視圖我無法導入任務類。

錯誤:

Traceback (most recent call last): 
    File "./run.py", line 8, in <module> 
    from project.application import create_app, db 
    File "/home/itmard/git/toggle-dev/project/__init__.py", line 1, in <module> 
    from project.application import create_app 
    File "/home/itmard/git/toggle-dev/project/application.py", line 5, in <module> 
    from project.apps.task.models import calculate_user_rate 
    File "/home/itmard/git/toggle-dev/project/apps/task/__init__.py", line 12, in <module> 
    from . import apis 
    File "/home/itmard/git/toggle-dev/project/apps/task/apis.py", line 12, in <module> 
    from project.apps.task.models import Task 
    File "/home/itmard/git/toggle-dev/project/apps/task/models.py", line 7, in <module> 
    from project.apps.user_rate.models import UserRate 
    File "/home/itmard/git/toggle-dev/project/apps/user_rate/__init__.py", line 8, in <module> 
    from . import views 
    File "/home/itmard/git/toggle-dev/project/apps/user_rate/views.py", line 10, in <module> 
    from project.apps.user_rate.forms import AddUserRateForm 
    File "/home/itmard/git/toggle-dev/project/apps/user_rate/forms.py", line 11, in <module> 
    from project.apps.workspace.models import workspaces 
    File "/home/itmard/git/toggle-dev/project/apps/workspace/__init__.py", line 12, in <module> 
    from . import apis 
    File "/home/itmard/git/toggle-dev/project/apps/workspace/apis.py", line 12, in <module> 
    from project.apps.task.models import Task 
ImportError: cannot import name Task 

項目結構:

├── project 
│   ├── application.py 
│   ├── apps 
│   │   ├── task 
│   │   │   ├── apis.py 
│   │   │   ├── forms.py 
│   │   │   ├── __init__.py 
│   │   │   ├── __init__.py~ 
│   │   │   ├── models.py 
│   │   │   └── views.py 
│   │   └── workspace 
│   │    ├── apis.py 
│   │    ├── forms.py 
│   │    ├── __init__.py 
│   │    ├── models.py 
│   │    └── views.py 
+3

你有一個循環導入。您需要重新安排代碼/導入以避免它。 – davidism 2014-08-31 07:11:50

回答

3

想想以下情形:

main.py

from a import whats_up 
print whats_up() 

模塊一:

first = 1 
from b import second 
third = 3 
def whats_up(): 
    return first + second + third 

模塊B:

second = 2 
from a import first 
print first 
from a import third 
print third 

此代碼遭受同樣的問題。

模塊a將在導入時爲它創建一個對象。然後它將有first分配給該對象。接下來,Python將開始導入模塊b。請注意,我們還沒有將third分配給模塊a呢!

當加載模塊b時,它將分配second,然後嘗試從a導入first。這將成功,因此將打印1。然後它將嘗試從a導入third。這是發生錯誤的地方:a從未完成加載到它定義的點third

現在,讓我們看看你的堆棧跟蹤:

你回溯看起來是這樣的:

Traceback (most recent call last): 
    File "./run.py", line 8, in <module> 
    from project.application import create_app, db 
    File "/home/itmard/git/toggle-dev/project/__init__.py", line 1, in <module> 
    from project.application import create_app 
    File "/home/itmard/git/toggle-dev/project/application.py", line 5, in <module> 
    from project.apps.task.models import calculate_user_rate 
    File "/home/itmard/git/toggle-dev/project/apps/task/__init__.py", line 12, in <module> 
    from . import apis 
    File "/home/itmard/git/toggle-dev/project/apps/task/apis.py", line 12, in <module> 
    from project.apps.task.models import Task 
    ... 
    File "/home/itmard/git/toggle-dev/project/apps/user_rate/forms.py", line 11, in <module> 
    from project.apps.workspace.models import workspaces 
    File "/home/itmard/git/toggle-dev/project/apps/workspace/__init__.py", line 12, in <module> 
    from . import apis 
    File "/home/itmard/git/toggle-dev/project/apps/workspace/apis.py", line 12, in <module> 
    from project.apps.task.models import Task 

注意...前右側的部分:在這一點上,tasks.models模塊正在導入。然而,重要的是7號線,你再這樣做:

from project.apps.user_rate.models import UserRate 

Task模型可以充分地定義之前,你開始加載user_rate.models模塊,它本身有一堆的,如果你遵循棧,定義跟蹤,並返回到其中一個也嘗試導入apps.tasks.models的模塊。

這導致循環依賴(例如,,模塊1取決於模塊2,取決於取決於模塊1的模塊3)。你需要重新思考你的模塊如何相互依賴來解決這個問題。