<p>在benvc的帮助下,我一直在寻找和思考,我找到了答案。你知道吗</p>
<p>我的重写模型:</p>
<pre class="lang-py prettyprint-override"><code>class PostsModel(db.Model):
__tablename__ = 'posts'
id = db.Column(db.BigInteger, server_default=db.FetchedValue(), primary_key=True)
project_id = db.Column(db.BigInteger, db.ForeignKey('projects.id'))
post = relationship("PostsModel", back_populates="nodes")
node = relationship("NodesModel", back_populates="posts")
</code></pre>
<pre class="lang-py prettyprint-override"><code>class PostsModel(db.Model):
__tablename__ = 'posts'
id = db.Column(db.BigInteger, server_default=db.FetchedValue(), primary_key=True)
project_id = db.Column(db.BigInteger, db.ForeignKey('projects.id'))
nodes = relationship("PostsNodesModel", back_populates="post")
</code></pre>
<pre class="lang-py prettyprint-override"><code>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)
posts = relationship("PostsNodesModel", back_populates="node")
</code></pre>
<p>查询:</p>
<pre class="lang-py prettyprint-override"><code>return (db.session.query(PostsModel.data_date, NodesModel.topic)
.join('nodes', 'node')
.filter(NodesModel.project_uuid == project_uuid)
.all())
</code></pre>
<p>nodes和node(在join语句中)使用PostsModel中的nodes变量,node是PostsNodesModel中的变量。你知道吗</p>
<p>有趣的是,必须先放置节点。如果您反转排列(即join('node','nodes'),Sqlalchemy声明PostsModel中没有node属性。如查询中所述,此查询从PostsModel读取到NodesModel。以下方法也适用:</p>
<pre class="lang-py prettyprint-override"><code>return (db.session.query(NodesModel.topic, PostsModel.data_date)
.join('posts', 'post')
.filter(NodesModel.project_uuid == project_uuid))
</code></pre>
<p>这将创建从NodesModel到PostsModel的join语句,join排列反映了这一点。你知道吗</p>