SQLAlchemy auto-jointure déclarative many-to-many via un objet Association

J'ai une table des Utilisateurs et d'une table d'Amis qui mappe des utilisateurs à d'autres utilisateurs que chaque utilisateur peut avoir beaucoup d'amis. Cette relation est évidemment symétrique: si l'utilisateur A est un ami de l'utilisateur B, alors l'utilisateur B est aussi un ami de l'utilisateur A, je ne stocker cette relation une fois. Les Amis de la table a des champs supplémentaires outre les deux ID d'Utilisateur j'ai donc utiliser un objet association.

Je suis en train de définir cette relation dans déclaratif de style dans les Utilisateurs de la classe (qui s'étend à l'ensemble des déclarations de la base), mais je n'arrive pas à comprendre comment faire cela. Je veux être en mesure d'accéder à tous les amis d'un utilisateur par l'intermédiaire d'une propriété amis, ce que disent les amis = bob.des amis.

Quelle est la meilleure approche pour résoudre ce problème? J'ai essayé à de nombreuses configurations différentes de la poster ici, et aucun d'entre eux travaillaient pour diverses raisons.

EDIT: Ma dernière tentative ressemble à ceci:

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)

    # Relationships
    friends1 = relationship('Friends', primaryjoin=lambda: id==Friends.friend1ID)
    friends2 = relationship('Friends', primaryjoin=lambda: id==Friends.friend2ID)


class Friends(Base):
    __tablename__ = 'friends'
    id = Column(Integer, primary_key=True)
    friend1ID = Column(Integer, ForeignKey('users.id') )
    friend2ID = Column(Integer, ForeignKey('users.id') )
    status = Column(Integer)

    # Relationships
    vriend1 = relationship('Student', primaryjoin=student2ID==Student.id)
    vriend2 = relationship('Student', primaryjoin=student1ID==Student.id)

Cela se traduit cependant l'erreur suivante:

InvalidRequestError: Table 'users' is already defined for this MetaData instance.  Specify 'extend_existing=True' to redefine options and columns on an existing Table object.

Je dois avouer qu'en ce moment je suis complètement confus, parce que de nombreuses tentatives ont échoué et ont fait plus d'une erreur stupide dans le ci-dessus.

source d'informationauteur Janny