在SQLAlchemy中“扩展”一个反复的多对多关系

时间:2013-07-01 16:04:25

标签: orm sqlalchemy python-elixir

使用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.related和{的并集组成的平面列表{1}}。如果我先执行m3.related然后再下载到其余的Python列表操作,这很容易做到,但是当q1返回许多对象时,似乎应该有更快的方法。有关如何做到这一点的任何想法?我应该在Elixir生成的中间表上使用某种连接来实现多对多关系吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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