I transform it into declarative way and its seems to work but it's not
bidirectional.
To support bidirectional friendship(A, B friends) i would say that you
might transform it into 2 unidirectional friendships (A friend of B and B
friend of A).
You could perhaps hide this complexity with an association_proxy which
creator_factory creates both both friendships
class User(Mixin, BASE):
id = Column(Integer, primary_key=True)
__tablename__ = 'user'
friends = None
class FriendShip(Mixin, BASE):
__tablename__ = 'friendship'
user_id = Column(Integer, ForeignKey(User.id))
friend_id = Column(Integer, ForeignKey(User.id))
User.friends = relationship(User, secondary='friendship',
primaryjoin=User.id==FriendShip.user_id,
secondaryjoin=User.id==FriendShip.friend_id)
On Thursday, March 15, 2012 1:03:27 AM UTC+1, Jon Parise wrote:
>
> I'm considering modeling many-to-many "friend" relationships between
> users using an association table. The tricky aspect is that I'd like
> the association table's entries to be "bidirectional", meaning the
> single entry (A,B) represents friendship in both directions.
>
> The "standard" way to model this doesn't support that usage:
>
> friendship_table = Table('friendship',
> Column('user_id', Integer, ForeignKey('user.id')),
> Column('friend_id', Integer, ForeignKey('user.id'))
> )
>
> class User(Base):
> id = Column(db.Integer, primary_key=True)
> friends = db.relationship('User',
> secondary=friendship_table,
> primaryjoin=id==friendship_table.c.user_id,
>
> secondaryjoin=id==friendship_table.c.friend_id)
>
> ... and I understand why it can't work as-is. My question is whether
> or not this type of relationship is possible to represent using
> relationship() (perhaps by using association_proxy()?).
>
> For the time being, I've just been writing per-operation queries in
> User instance methods and @property descriptors, but it would be nice
> to wrap this up in an proper attributed object that plays nicely with
> the session.
>
>
On Thursday, March 15, 2012 1:03:27 AM UTC+1, Jon Parise wrote:
>
> I'm considering modeling many-to-many "friend" relationships between
> users using an association table. The tricky aspect is that I'd like
> the association table's entries to be "bidirectional", meaning the
> single entry (A,B) represents friendship in both directions.
>
> The "standard" way to model this doesn't support that usage:
>
> friendship_table = Table('friendship',
> Column('user_id', Integer, ForeignKey('user.id')),
> Column('friend_id', Integer, ForeignKey('user.id'))
> )
>
> class User(Base):
> id = Column(db.Integer, primary_key=True)
> friends = db.relationship('User',
> secondary=friendship_table,
> primaryjoin=id==friendship_table.c.user_id,
>
> secondaryjoin=id==friendship_table.c.friend_id)
>
> ... and I understand why it can't work as-is. My question is whether
> or not this type of relationship is possible to represent using
> relationship() (perhaps by using association_proxy()?).
>
> For the time being, I've just been writing per-operation queries in
> User instance methods and @property descriptors, but it would be nice
> to wrap this up in an proper attributed object that plays nicely with
> the session.
>
>
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To view this discussion on the web visit
https://groups.google.com/d/msg/sqlalchemy/-/f5ydw1T4gloJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.