在 SQLAlchemy 中“扩展”自反多对多关系

Posted

技术标签:

【中文标题】在 SQLAlchemy 中“扩展”自反多对多关系【英文标题】:"Expanding" a reflexive Many to Many relationship in SQLAlchemy 【发布时间】:2013-07-01 16:04:24 【问题描述】:

使用 Elixir 0.7.1 和 SQLAlchemy 0.7.8,我创建了一个与自身具有多对多关系的模型,如下所示:

from elixir import *

class MyModel(Entity):
    name = Field(Unicode(30))
    related = ManyToMany('MyModel')

现在,如果我对这些有一些任意查询,请说

q1 = MyModel.query.filter(MyModel.name.like("%Bob%"))

然后我想构建一个单独的查询,该查询将返回与q1 中的任何对象相关的不同 MyModel 对象的平面列表。也就是说,如果我有

q1.all() == [m1, m2, m3]

然后我想要一个查询q2(可能以q1 作为子查询),它将返回一个由m1.relatedm2.relatedm3.related 的并集组成的平面列表。如果我先执行 q1 然后下拉到 Python 列表操作其余部分,这很容易做到,但是当 q1 返回许多对象时,似乎应该有更快的方法。关于如何做到这一点的任何想法?我是否应该在 Elixir 生成的中间表上使用某种形式的连接来实现多对多关系?

谢谢!

【问题讨论】:

【参考方案1】:

看起来有一个简单的解决方案,无需显式引用连接表:

q2 = MyModel.query.join(q1.subquery(), MyModel.related)

【讨论】:

以上是关于在 SQLAlchemy 中“扩展”自反多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

如何避免在 SQLAlchemy - python 的多对多关系表中添加重复项?

SQLAlchemy 使用关联配置与自我的多对多关系

sqlalchemy中的多对多自引用关系

防止 SQLAlchemy 中多对多关系中的重复表条目

SQLAlchemy如何反映多对多关系

通过 SQLAlchemy 选择多个多对多关系