SQLAlchemy – Relación auto-referencial de muchos a muchos con una columna extra

Tengo un modelo que representa al usuario y quiero crear una relación entre los usuarios que representan que son amigos. Mi modelo funcional con tabla de asociación y métodos para enumerar a todos los amigos se ven así.

friendship = db.Table('friend', db.Column('id', db.Integer, primary_key=True), db.Column('fk_user_from', db.Integer, db.ForeignKey('user.id'), nullable=False), db.Column('fk_user_to', db.Integer, db.ForeignKey('user.id'), nullable=False) ) class User(db.Model): ... ... friends = db.relationship('User', secondary=friendship, primaryjoin=(friendship.c.fk_user_from==id), secondaryjoin=(friendship.c.fk_user_to==id), backref = db.backref('friend', lazy = 'dynamic'), lazy = 'dynamic') def list_friends(self): friendship_union = db.select([ friendship.c.fk_user_from, friendship.c.fk_user_to ]).union( db.select([ friendship.c.fk_user_to, friendship.c.fk_user_from] ) ).alias() User.all_friends = db.relationship('User', secondary=friendship_union, primaryjoin=User.id==friendship_union.c.fk_user_from, secondaryjoin=User.id==friendship_union.c.fk_user_to, viewonly=True) return self.all_friends 

El problema es que necesito implementar el pedido de amistad y el estado pendiente antes de la confirmación (tal como lo sabe en Facebook), por lo que es necesario agregar una columna adicional a la tabla de amigos. De acuerdo con el tutorial de SQLAlchemy , debería crear un objeto de asociación, ¿pero cómo hacerlo de nuevo?

¿O es posible simplemente agregar esta columna a mi tabla de amigos actual y acceder y cambiar el valor de estado de alguna manera?

Gracias

Todo lo que necesitas es agregar primaryjoin en tu tabla y también hacer dos llaves foráneas en la tabla de Amistad, ‘primary_key’ también. También necesitas hacer amistad como clase.

 class Friendship(db.Model): __tablename__ = 'friend' fk_user_from = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True) fk_user_to = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True) extra_field = db.Column(db.Integer) class User (db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True) user_to = db.relationship('Friendship',backref='to', primaryjoin=id==Friendship.fk_user_to) user_from = db.relationship('Friendship',backref='from', primaryjoin=id==Friendship.fk_user_from ) 

Y para agregar un amigo necesitas definir la amistad como:

 friend = Friendship(extra_field=0 , to=me , from=my_friend)