使用关联Obj查询SQLAlchemy ORM的父级

2024-09-29 19:36:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在查询nodes表时从posts和nodes表返回数据

这些是我的模型:

class NodesModel(db.Model):
    __tablename__ = 'nodes'

    id = db.Column(db.BigInteger, primary_key=True)
    project_uuid = db.Column(UUID(as_uuid=True), db.ForeignKey('projects.uuid'))
    topic = db.Column(db.String(15), nullable=False)

    posts_nodes = relationship("PostsNodesModel", backref="nodes")


class PostsModel(db.Model):
    __tablename__ = 'posts'

    id = db.Column(db.BigInteger, server_default=db.FetchedValue(), primary_key=True)
    project_uuid = db.Column(UUID(as_uuid=True), db.ForeignKey('projects.uuid'), nullable=False)
    post = db.Column(db.String, nullable=False)

    posts_nodes = relationship("PostsNodesModel", backref="posts")


class PostsNodesModel(db.Model):
    __tablename__ = 'posts_nodes'

    post_id = db.Column(db.BigInteger, db.ForeignKey('posts.id'), primary_key=True)
    node_id = db.Column(db.BigInteger, db.ForeignKey('nodes.id'), primary_key=True)

我正在查询nodes.topic以获取我想要的主题,并通过posts\u节点查找包含该主题的所有帖子

selected = (db.session.query(NodesModel.id, NodesModel.topic, PostsModel.post)
            .filter(PostsModel.id == PostsNodesModel.post_id)
            .filter(PostsNodesModel.node_id == NodesModel.id)
            .filter(NodesModel.project_uuid == project_uuid)
            .filter(NodesModel.topic == 'tomorrow')
            .all())

这可能不是正确的方法(而且看起来很笨拙)。难道没有人知道如何使这个查询更简单吗?特别是这两个过滤器:

.filter(PostsModel.id == PostsNodesModel.post_id)
.filter(PostsNodesModel.node_id == NodesModel.id)

我在某个地方读到(我现在找不到)有了中的关系,我不必这样做,因为Sqlalchemy会看到关联并在后面执行,查询可以是

selected = (db.session.query(NodesModel.id, NodesModel.topic, NodesModel.track, PostsModel.post)
            .filter(NodesModel.project_uuid == project_uuid)
            .filter(NodesModel.topic == 'tomorrow')
            .all())

但它不起作用

谢谢。 德斯蒙德


Tags: projectidtruedbtopicuuidcolumnfilter

热门问题