SqlAlchemy:获取关系中某个类型的实例,该实例可以包含多种类型的对象

2024-10-03 09:17:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有“BaseVisibilizer”类的应用程序 其他两个班的班级:

class BaseVisibilizer(declarativeBase):
       __tablename__ = "base_visibilizers"
       _polymorphicIdentity = Column("polymorphic_identity", String(20), key="polymorphicIdentity")
       __mapper_args__ = {
               'polymorphic_on': _polymorphicIdentity,
               'polymorphic_identity': None
       }

       def __init__(self):
               super(BaseVisibilizer, self).__init__()

这是我的User和UserGroup类的基类:两个类 可用于控制某些项目的可见性。

^{pr2}$
class User(BaseVisibilizer.BaseVisibilizer):
       __tablename__ = "users"
       _id = Column("id", Integer, ForeignKey(BaseVisibilizer.BaseVisibilizer.id), primary_key=True)

       __mapper_args__ = {
               'polymorphic_identity': 'User',
               'inherit_condition': _id == BaseVisibilizer.BaseVisibilizer._id,
       }
       _firstName = Column("first_name", String(50), key="fistName")
       _lastName = Column("last_name", String(50), key="lastName")
       _userName = Column("user_name", String(50), unique=True, nullable=False)

在我的系统的许多其他类中,我有一种关系 可以包含“BaseVisibilizers”(用户或用户组)。

class Whatever(declarativeBase):
       allowedVisibilizers = relationship("BaseVisibilizer",
               secondary="intermediate_whatevers_to_base_visibilizers",
               collection_class=set)

所以在任何情况下,allowedVisibilizers集合可以 包含UserGroup的User实例(因为两者都是 基地探视器)。如果登录用户或用户组 属于是“允许的访问者”之一,该用户将能够 访问(或“看到”)任何事物的实例。

在某一点上,我想在Whatever中创建一个方法 类,它只给我允许的 实际上是一个用户组(丢弃用户),但我无法 去做吧。

我试过好几种方法,但显然不是正确的 “允许访问”的查询“…”:

What I'd like is something like:
class Whatever(declarativeBase):
       [ . . . ]
       def getAllowedUserGroups(self):
               session = Database.Session()
               query = session.query(UserGroup.UserGroup).filter(UserGroup.UserGroup.in_(self.allowedVisibilizers))
               return query.all()

(但很明显,UserGroup是一个类,没有in-uu)

当然,我总是可以让所有的“允许探视者”然后移除 用户返回的值,但我试图使它 一点点优化,避免不必要的调用 数据库。

任何提示都将不胜感激。提前谢谢你!


Tags: key用户nameselfidstringcolumnidentity
1条回答
网友
1楼 · 发布于 2024-10-03 09:17:46

一种解决方案是在Whatever上创建另一个关系,该关系将包含到特定表UserGroup的筛选器,这应该可以做到这一点。
有关详细信息,请参阅Multiple Relationships against the Same Parent/Child文档。在您的例子中,在UserGroup表上添加额外的连接条件就可以了。
还要考虑使用Building Query-Enabled Properties来指定readonly。在

相关问题 更多 >