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

上一篇: sqlalchemy + flask: class is not defined

下一篇: mapping a column to separate table