python - SQLAlchemy 映射以列出相关对象

标签 python postgresql sqlalchemy orm

我在 SQLAlchemy 中的两个实体之间的映射关系上遇到问题。我正在尝试实现下一个行为 -> 映射到用户所有相关的反馈。该关系是通过另一端的 receiver_id 实现的,它等于 user_id。因此,用户 1 正在向用户 2 发送反馈,当我获取用户 2 对象时,我试图将它们作为列表获取。我有下一个代码

class User(Base):
    __tablename__ = "user"
    user_id = sa.Column('user_id', UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    first_name = sa.Column('first_name', sa.String)
    last_name = sa.Column('last_name', sa.String)
    phone_number = sa.Column('phone_number', sa.String(20), unique=True)
    email = sa.Column('email', sa.String, unique=True)
    is_active = sa.Column('is_active', sa.Boolean, server_default=expression.true(), nullable=False)
    deleted = sa.Column('deleted', sa.Boolean, server_default=expression.false(), nullable=False)
    created_time = sa.Column('created_time', sa.DateTime, server_default=func.now(), nullable=False)
    updated_time = sa.Column('updated_time', sa.DateTime, server_default=func.now(), nullable=False)
    deleted_time = sa.Column('deleted_time', sa.DateTime)
    feedbacks = relationship('UserFeedback', primaryjoin='User.user_id == UserFeedback.receiver_id', uselist=True, lazy='dynamic', backref='user_feedback')


class UserFeedback(Base):
    __tablename__ = "user_feedback"
    id = sa.Column('id', sa.Integer, primary_key=True, autoincrement=True)
    sender_id = sa.Column(UUID(as_uuid=True), ForeignKey("user.user_id"), nullable=False)
    receiver_id = sa.Column(UUID(as_uuid=True), ForeignKey("user.user_id"), nullable=False)

    sender = relationship("User", foreign_keys=[sender_id])
    receiver = relationship("User", foreign_keys=[receiver_id])

    rating = sa.Column('rating', sa.DECIMAL, nullable=False)
    feedback = sa.Column('feedback', sa.String, nullable=False)
    date = sa.Column('date', sa.DateTime, server_default=func.now(), nullable=False)

我已经用用户反馈填充了数据库,但是当我拉取用户 ORM 时,没有映射相关反馈。它实际上甚至没有这个字段,所以这有点令人困惑

我正在学习 SQLAlchemy,因此非常感谢对此的帮助或建议

最佳答案

问题是您正在使用动态关系加载策略( the docs are here )。

当使用lazy = 'dynamic'查询时,SQLAlchemy会生成一个单独的查询而不是获取实际结果。因此,在您的初始情况下,feedbacks 属性包含另一个您可以手动执行的 select 语句(AppenderQuery 类型)。

要简单地获取相关数据,只需将“动态”更改为“已加入”即可。

您可以在the docs中阅读有关关系加载策略的更多信息。或在 this beautiful post .

关于python - SQLAlchemy 映射以列出相关对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72832694/

相关文章:

java - 数据库函数引号内的 JDBI 绑定(bind)值

postgresql - 我可以从 JDBC 连接为 Postgres 设置 session 变量吗

Flask/SqlAlchemy 中的继承

python - Flask SqlAlchemy 有没有办法将表格大小限制为 n 行

python - 完整性错误 : update or delete violates foreign key constraint. Django + PostgreSQL

python - 使用 sklearn 使用 k 折叠来预测测试数据的类别

python - 递归使用Scrapy从网站上抓取网页

python - 如何使用 python 脚本删除前导两个整数?

perl DBI 和准备好的语句名称冲突

python - 如何定义自定义过滤器并将其绑定(bind)到资源端点