2013-07-16 58 views
6

我知道類似的問題已經被問到,但是我真的很難理解SQLAlchemy中如何實現泛型字段。SQLAlchemy通用關係簡單示例

我有一個Permissions類/表,我想包含一個可以與任何模型類型相關的字段。

我已經看過的例子,這個博客帖子http://techspot.zzzeek.org/2007/05/29/polymorphic-associations-with-sqlalchemy/

是否有可能有沒有一個單獨的表的一般關係?只需存儲object_type和id?沿着這些線:

class Permission(AbstractBase): 
    user = relationship("User", backref=backref('permissions')) 
    permission_type = column(String()) 
    object = #The object the permission applies to, could be any type. 

我想只是一個非常簡單的例子,將不勝感激!

另外,值得注意的是我來自Django背景!

感謝

+0

你是什麼意思「沒有另一張桌子」?你能更好地定義你的SQL模式的樣子嗎? –

+0

對不起,我應該讓自己更清楚。通過沒有另一個表,我的意思是有一個單獨的表來存儲通用關係。 – Charlie

+1

這是一箇舊的博客文章,其中包含較舊的模式,但第一個示例「rails如何使用它」也是django方法 - 它放棄使用傳統外鍵以避免需要額外的表。但爲什麼如此重要,不正確地構建您的模式只是爲了保存表? – zzzeek

回答

5

您還可以使用sqlalchemy-utils包中的generic_relationship

這是example for their documentation;

from sqlalchemy_utils import generic_relationship 

class User(Base): 
    __tablename__ = 'user' 
    id = sa.Column(sa.Integer, primary_key=True) 

class Customer(Base): 
    __tablename__ = 'customer' 
    id = sa.Column(sa.Integer, primary_key=True) 

class Event(Base): 
    __tablename__ = 'event' 
    id = sa.Column(sa.Integer, primary_key=True) 
    object_type = sa.Column(sa.Unicode(255)) 
    object_id = sa.Column(sa.Integer) 
    object = generic_relationship(object_type, object_id)