Reputation: 443
I know similar questions have been asked, however I am really struggling to understand how generic fields are implemented in SQLAlchemy.
I have a Permissions class/table which I want to contain a field which can relate to any model type.
I have looked at the examples and this blog post http://techspot.zzzeek.org/2007/05/29/polymorphic-associations-with-sqlalchemy/
Is it possible to have a generic relation without a separate table? Just by storing the object_type and id? Something along these lines:
class Permission(AbstractBase):
user = relationship("User", backref=backref('permissions'))
permission_type = column(String())
object = #The object the permission applies to, could be any type.
I guess just a really simple example would be appreciated!
Also, it's worth noting I am coming from a Django background!
Thanks
Upvotes: 9
Views: 5666
Reputation: 2443
You can also use generic_relationship
from the sqlalchemy-utils
package.
Here's an 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)
Upvotes: 12
Reputation: 75117
Someone else asked the identical question about a day later, I pointed to the three examples we have for this kind of thing but also I wrote a new example that will do (mostly) the same thing Django does (minus that weird "contenttypes" table): sqlalchemy generic foreign key (like in django ORM)
Upvotes: 5