查询以检查SQLAlchemy中集合的大小是0还是空?

时间:2014-01-14 13:31:57

标签: python sqlalchemy flask

Person有一个Building

Person有很多Group

我想返回peoplebuilding收藏中没有Group的{​​{1}}的所有groups
也许我可以搜索拥有长度为0的组列表的人? 类似的东西:

unassigned=Person.query.filter(Person.building==g.current_building,Person.groups.any()).all()

3 个答案:

答案 0 :(得分:13)

any使用否定(~):

q = session.query(Person)
q = q.filter(Person.building == g.current_building)
q = q.filter(~Person.groups.any())
在你的情况下,

any比你需要的更强大,但它可以很好地完成任务。

答案 1 :(得分:0)

首先计算每个建筑物的群组,然后对该计数进行过滤。

gc = session.query(
    Person.id,
    db.func.count(Group.id).label('gc')
).join(Person.groups).group_by(Person.id).subquery()

unassigned = session.query(Person).join(
    (gc, gc.c.person_id == Person.id)
).filter(
    Person.building == g.current_building,
    gc.c.gc == 0
).all()

答案 2 :(得分:0)

如果您需要在查询后知道某个关系是否有记录,请对该关系使用count()方法:

persons = session.query(Person).filter(Person.building == g.current_building).all()
for p in persons:
    if p.groups.count():
        print("%s have groups" % p)