2013-07-16 31 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)