我有四个类,如:Group
,Parent
,Child
,Toy
。
Group
的{{1}}关系指向parents
Parent
的{{1}}关系指向Parent
children
的{{1}}关系指向Child
Child
有一个toys
Toy
,可生成Parent
个孩子拥有的所有toys
个。
我希望能够获得团体中的所有玩具。我尝试在association_proxy
上创建Toy
链接到Parent
的{{1}},但它产生了这个:
association_proxy
我想要的时候:
Group
如果Parent
的{{1}}没有任何toys
,则[[<Toy 1>, <Toy 2>], [], [], []]
关联代理为[<Toy 1>, <Toy 2>]
。但是,第二个关联代理不知道要排除空列表。此外,列表应折叠。反正有没有让它发挥作用?
Parent
答案 0 :(得分:6)
鉴于这些仅用于检索和查看(正如您在评论中提到的那样,添加会模棱两可),我宁愿做一个viewonly
关系,不用 {{1} }:
association_proxy
请注意,这是SQLAlchemy的一项新功能,并在文档的Composite “Secondary” Joins
部分进行了描述。
然后你可以将它用于查询:
class Group(db.Model):
# ...
toys = relationship('Toy',
secondary="join(Group, Parent, Group.id == Parent.group_id).join(Child, Parent.id == Child.parent_id)",
primaryjoin="and_(Group.id == Parent.group_id, Parent.id == Child.parent_id)",
secondaryjoin="Child.id == Toy.child_id",
viewonly=True,
)
或者您甚至可以使用它来过滤,所以要找到一个包含名为“超级马里奥”玩具的小组,您可以这样做:
group_id = 123
group = session.query(Group).get(group_id)
print(group.toys)
但实际上所有这些都可以通过简单查询来完成,或者创建一个启用查询的属性。请参阅文档的Customizing Column Properties部分,您可以在其中使用任何简单属性group = session.query(Group).filter(Group.toys.any(Toy.name == "Super Mario"))
或column_property
。