SQLAlchemy + Flask: 类未定义。

3
我可以为您提供翻译。以下是翻译的结果:

我正在使用SQLAlchemy + Alembic + Flask,但我无法映射循环类。

apps/users/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')

apps/notes/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 是为了建立 User <-> Notes 的 m2m 关系而创建的,但在我启动应用程序并执行一些请求后,出现了错误:

InvalidRequestError: 在初始化 Mapper|User|users 映射器时, 表达式 'Note2User' 无法定位名称(“名称 'Note2User' 未定义”)。 如果这是一个类名,请考虑在两个依赖类被定义之后将此 relationship() 添加到该类中。

在 db/init.py 中初始化数据库:(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)
2个回答

4
apps/users/models.py 文件中为 Note2User 类添加导入,这样在初始化引用它的 User 类中定义该模型之前就可以先定义此模型。 如下所示:
# file: apps/users/models.py
from ..notes.models import Note2User

1
这个可以用,但我还是猜想框架不应该负责所有已注册的类、名称和关系吗? - silentsudo

2

你需要将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

and only use

import bar.foo as foo

出于这个原因,使用import语法被认为是最佳实践。 参考资料


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接