SqlAlchemy:在可以包含多种类型对象的关系中获取特定类型的实例

时间:2011-05-15 21:13:31

标签: python oop class sqlalchemy relationship

我有一个基础的“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类的基类:两个类 可用于控制某些项目的可见性。

class UserGroup(BaseVisibilizer.BaseVisibilizer):
       __tablename__ = "user_groups"
       _id = Column("id", Integer, ForeignKey(BaseVisibilizer.BaseVisibilizer.id), primary_key=True)

       __mapper_args__ = {
               'polymorphic_identity': 'UserGroup',
               'inherit_condition': _id == BaseVisibilizer.BaseVisibilizer._id,
       }

       _name = Column("name", String(50), nullable=False)

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)

因此,在Whatever的实例中, allowedVisibilizers 设置即可 包含UserGroup用户的实例(因为两者都是 BaseVisibilizers)。如果已登录用户或UserGroup已登录用户 属于“allowedVisibilizers”,用户将能够 访问(或“看”)该Whatever的实例。

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

我尝试了几件事,但很明显,不是正确的 (子查询,“allowedvisibilizers”的连接......):

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 _)

当然,我总是可以获得所有“allowedVisibilizers”并删除 用户从返回的值,但我试图使它成为一个 比这稍微优化一点,避免不必要的调用 数据库中。

任何提示都将非常感激。提前谢谢!

1 个答案:

答案 0 :(得分:0)

一个解决方案是在Whatever上创建另一个关系,其中包括特定表UserGroup的过滤器,这应该可以解决问题。
有关详细信息,请参阅Multiple Relationships against the Same Parent/Child文档。在你的情况下,在UserGroup表上添加额外的连接条件应该可以解决问题 另请考虑使用Building Query-Enabled Properties指定readonly