sqlalchemy + flask:类未定义
我正在使用sqlalchemy + alembic + Flask,我无法映射循环类。
应用/用户/ 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')
Table Note2User为m2m关系制作了User < - > Notes,但是当我启动应用程序并完成一些请求时,出现错误:
InvalidRequestError:初始化映射器Mapper | User |用户时,表达式'Note2User'找不到名称(“name'Note2User'is not defined”)。 如果这是一个类名,考虑在定义了两个相关类之后,将这个关系()添加到类中。
在db / init .py中初始化db:(dunder name)
from sqlalchemy import create_engine, MetaData
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import Session
engine = create_engine('postgresql+psycopg2://server:12345@localhost:5432/test')
Base = declarative_base()
meta = MetaData()
meta.reflect(bind=engine)
db_session = Session(bind=engine)
在apps/users/models.py
文件中为Note2User
类添加一个导入,以便在初始化User
类中的Note2User
之前先定义此模型。 喜欢这个
# file: apps/users/models.py
from ..notes.models import Note2User
您需要将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
出于这个原因,使用导入语法被认为是最佳实践。 参考。
链接地址: http://www.djcxy.com/p/63431.html