Hi Mike, I have two models that I did not provide in the example: Entity and Group. Every group can assign some customer attributes to an entity, this is reflected in GroupEntityAttributes. Let's say GroupEntityAttributes(group_id=1, entity_id=1, key="color", value="red") would mean that Group 1 assigned a customer attribute "color" with a value "red" to the entity with id 1. So when I want to load an entity for a group I want to load the entity object plus all the custom attributes assigned to the entity but the group. Also I need some mechanism mark an entity as loadable for the group, for this I am using a record like GroupEntityAttributes(group_id=1, entity_id=1, key="_has_connection", value=Null), so *key* *"_*has_connection*"* has a special meaning. If it presents, then the entity should be loaded for the group with all other custom attributes, otherwise no. For this purpose I created a model GroupEntity.
So this way GroupEntity.query.filter_by(group_id=1).all() will give a list with all entities loadable fir the Group 1. Every item of the list will have an association to Group object and Entity object, I want *others* property to represent a list of customer attributes, that I would like to implement as described here (https://bitbucket.org/zzzeek/sqlalchemy/src/374173e89d4e21a75bfabd8a655d17c247b6f1fc/examples/vertical/dictlike.py?at=master). For this I need to have a self referencing relationship to GroupEntityAttributes, which appears to be self-referencing because two models use the same table. SimpleModel is just a mixin that I use in every model I create to make sure that they all have a unique id. Thanks, Anton. On Wednesday, September 10, 2014 3:00:39 PM UTC-7, Michael Bayer wrote: > > > On Sep 10, 2014, at 5:11 PM, Anton <ansch...@gmail.com <javascript:>> > wrote: > > So I am trying to do the following: > class SimpleModel(object): > __table_args__ = {'extend_existing': True} > > id = db.Column(db.Integer, primary_key=True) > > class GroupEntityAttributes(SimpleModel, db.Model): > __table_args__ = {'extend_existing': True} > __tablename__ = 'group_entity' > > #Table Columns > id = db.Column(db.Integer, primary_key=True) > group_id = db.Column(db.Integer, db.ForeignKey('groups.id'), nullable= > False) > entity_id = db.Column(db.Integer, db.ForeignKey('entities.id'), > nullable=False) > key = db.Column(db.String) > value = db.Column(db.Text) > > #Relationships > entity = db.relationship('Entity', lazy='joined') > group = db.relationship('Group') > > class GroupEntityAttributesPoly(GroupEntityAttributes): > __mapper_args__ = {'polymorphic_on': GroupEntityAttributes.key} > > class GroupEntity(GroupEntityAttributesPoly): > __mapper_args__ = {'polymorphic_identity': '_has_connection'} > > others = db.relationship( > 'GroupEntityAttributes', > primaryjoin=and_( > remote(foreign(GroupEntityAttributes.group_id)) == > GroupEntityAttributes.group_id, > remote(foreign(GroupEntityAttributes.entity_id)) == > GroupEntityAttributes.entity_id, > ) > ) > > > > What’s illustrated here doesn’t really make sense. If > GroupEntityAttributes.group_id referred to “groups.id”, then a > relationship extending from GroupEntity would need to refer to whatever > class is mapped to the “entities” table, which I don’t see here. It looks > like you’re taking foreign key columns on the “group_entity” table and > somehow pointing it to itself in that primaryjoin which doesn’t make sense. > GroupEntity would need to be mapped to either “entities” or “groups” in > order to refer to GroupEntityAttributes using that pattern and this sort of > looks like the association object pattern, see > http://docs.sqlalchemy.org/en/rel_0_9/orm/relationships.html#association-object > > for an example of what that looks like. > > Other things that you probably don’t want: > > 1. polymorphic_on on a subclass, that should always go on the mapped class > at the bottom of the hierarchy, see > http://docs.sqlalchemy.org/en/rel_0_9/orm/inheritance.html#joined-table-inheritance > > for basic examples > > 2. extend_existing, this is usually only relevant when you’re using > reflection, otherwise it probably means you’re setting things up > incorrectly > > > > > > > > > > > When I try to load the model GroupEntity I get an error: > ArgumentError: Can't determine relationship direction for relationship ' > GroupEntity.others' - foreign key columns within the join condition are > present in both the parent and the child's mapped tables. Ensure that only > those columns referring to a parent column are marked as foreign, either > via the foreign() annotation or via the foreign_keys argument. > > I am not sure how to overcome this error. Would appreciate any help. > > Best, > Anton. > > On Tuesday, September 9, 2014 1:10:40 PM UTC-7, Anton wrote: >> >> Trying to use with multiple table mapping. >> >> On Tuesday, September 9, 2014 1:03:25 PM UTC-7, Anton wrote: >>> >>> Hi, >>> >>> I need some help choosing the right pattern for the models I have. I >>> have the following tables: >>> Entity (INT id, VARCHAR name) >>> Group (INT id, VARCHAT name) >>> GroupEntityAttributes(INT entity_id, INT group_id, VARCHAR key, VARCHAR >>> name) >>> >>> Entity and Group models are pretty straight forward. But >>> GroupEntityAttributes represents Entity within some group with custom >>> attributes added, so it resembles this pattern ( >>> https://bitbucket.org/zzzeek/sqlalchemy/src/374173e89d4e21a75bfabd8a655d17c247b6f1fc/examples/vertical/dictlike.py?at=master >>> >>> ), the only difference is that there is an additional foreign key. >>> I wonder if there is any approach I can use to adapt vertical pattern >>> for my needs without modifying tables. >>> >>> Best, >>> Anton. >>> >>> >>> > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to sqlalchemy+...@googlegroups.com <javascript:>. > To post to this group, send email to sqlal...@googlegroups.com > <javascript:>. > Visit this group at http://groups.google.com/group/sqlalchemy. > For more options, visit https://groups.google.com/d/optout. > > > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at http://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.