SQLAlchemy为伟大的孙子代表链接代理?

时间:2014-10-30 19:13:21

标签: python sqlalchemy flask-sqlalchemy

我有四个类,如:GroupParentChildToy

  • 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

1 个答案:

答案 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