2017-04-23 121 views
0

我正在使用sqlalchemy + alembic + Flask,我無法映射圓形類。sqlalchemy + flask:class沒有定義

應用/用戶/ models.py:

class User(Base): 
    __tablename__ = 'users' 

    id = Column(Integer, primary_key=True) 
    email = Column(String) 
    password = Column(String) 
    session = relationship("Session", back_populates='user', cascade='all,delete', lazy='dynamic') 

    notes = relationship('Note2User', back_populates='user', cascade='all,delete', lazy='dynamic') 

應用/筆記/ models.py:

class Note2User(Base): 
    __tablename__ = 'notes_users_m2m' 

    id = Column(Integer, primary_key=True) 

    user_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE'), nullable=False) 
    user = relationship('User', back_populates='notes') 
    note_id = Column(Integer, ForeignKey('notes.id', ondelete='CASCADE'), nullable=False) 
    note = relationship('Note', back_populates='users') 

表Note2User爲M2M關係用戶作出< - >注,但是當我開始應用程序並做了一些請求,得到錯誤:

InvalidRequestError: When initializing mapper Mapper|User|users, expression 'Note2User' failed to locate a name ("name 'Note2User' is not defined"). If this is a class name, consider adding this relationship() to the class after both dependent classes have been defined.

正在初始化分貝db/初始化的.py:(dunder名)

from sqlalchemy import create_engine, MetaData 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import Session 

engine = create_engine('postgresql+psycopg2://server:[email protected]:5432/test') 

Base = declarative_base() 

meta = MetaData() 
meta.reflect(bind=engine) 

db_session = Session(bind=engine) 

回答

2

Note2User類添加導入在apps/users/models.py文件,使這一模式被初始化中User類refrences它是relatioship之前首先定義。 這樣

# file: apps/users/models.py 
from ..notes.models import Note2User 
1

您需要的user.models模塊導入notes.model模塊,反之亦然。這將是這個樣子:

# file app/users/models.py 
import app.notes.models as notes 
# use it like this 
notes.Notes2User() 


# file app/notes/models.py 
import app.users.models as users 
users.User() 

的優勢,這是你將避免循環依賴問題,因爲你的程序不可避免地增長。當我使用同一個堆棧創建應用程序時,我遇到了很多循環依賴問題。唯一的解決辦法就是溝

from . import Foo 

,並且只使用

import bar.foo as foo 

它被認爲是使用進口的語法爲此最佳實踐。 Reference