2011-05-15 59 views
0

我有一個應用程序具有「BaseVisibilizer」類的對象的關係也就是基地 用於其它兩個類的類:SQLAlchemy的:獲取某些類型的實例中,它可以包含多種類型的

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) 

所以不管的情況下,allowedVisibilizers集可以 包含用戶組的用戶的情況下(因爲兩者都是 BaseVisibilizers)。如果記錄的用戶或登錄用戶 所屬的用戶組屬於「allowedVisibilizers」中,那麼該用戶將能夠 訪問(或「查看」)無論哪個實例。

在某一點上,我想創造的無論 類的方法,這將使我只允許visibilizers是 實際上(丟棄用戶)一個用戶組的,但我一直沒能 做它。

我已經試過幾件事情,但很明顯,不正確的 (子查詢,「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() 

(但顯然,用戶組是一個類,並沒有按」噸有一個IN_)

當然,我總是可以得到所有的「allowedVisibilizers」,並從返回的值刪除 的用戶,但我試圖使它比優化的 點點,避免不必要的調用數據庫 。

任何提示將非常感激。先謝謝你!

回答

相關問題