2017-04-23 116 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