SQLAlchemy&;复杂查询

SQLAlchemy&;复杂查询,sql,join,sqlalchemy,python-elixir,Sql,Join,Sqlalchemy,Python Elixir,我必须为现有应用程序实现ACL 因此,我将auser、group和groupmembers表添加到数据库中。 我通过关联表groupmembers定义了用户和组之间的多种关系 为了保护应用程序的某些资源(即,项目),我添加了一个额外的关联表auth_items,该关联表应用作组/用户与特定项目之间的多个关系的关联表 项目包含以下列: 用户id-->用户表 组id-->组表 项目id-->项目表 至少设置了用户id和组id列的on。因此,可以为组或用户定义对特定项目的访问权限 我使用Assoc

我必须为现有应用程序实现ACL
因此,我将ausergroupgroupmembers表添加到数据库中。
我通过关联表groupmembers定义了用户之间的多种关系
为了保护应用程序的某些资源(即,项目),我添加了一个额外的关联表auth_items,该关联表应用作组/用户与特定项目之间的多个关系的关联表

项目包含以下列:

  • 用户id-->用户表
  • 组id-->组表
  • 项目id-->项目表
至少设置了用户id组id列的on。因此,可以为组或用户定义对特定项目的访问权限

我使用AssociationProxy定义了用户/组和项目之间的关系。

我现在想显示用户有权访问的所有项目,我很难做到这一点。使用以下标准:

  • 应显示用户拥有的所有项目(item.owner\u id=user.id)
  • 应显示所有公共项(item.access=public)
  • 应显示用户有权访问的所有项目(auth_item.user_id=user.id)
  • 应显示用户组有权访问的所有项目
前三个标准非常简单,但我很难做到第四个

我的做法如下:

clause = and_(item.access == 'public')
if user is not None:
   clause = or_(clause,item.owner == user,item.users.contains(user),item.groups.contains(group for group in user.groups))
第三个标准产生一个错误

item.groups.contains(group for group in user.groups)
实际上,我不确定这是否是一个好方法。
过滤众多关系的最佳方法是什么?
如何根据其他列表/关系筛选多个关系?

顺便说一句,我正在使用最新的sqlalchemy(6.0)和elixir版本

谢谢你的见解

contains()
方法用于单项检查。假设您的组表映射到
类,请尝试以下操作:

item.groups.any(Group.id.in_([group.id for group in user.groups])
contains()
方法用于单项检查。假设您的组表映射到
类,请尝试以下操作:

item.groups.any(Group.id.in_([group.id for group in user.groups])

谢谢你的建议。我明天会试试,并报告我的发现。谢谢你的建议。我明天会尝试一下,并报告我的发现。