O padrão que você está tentando implementar é um caso especial de relacionamento muitos para muitos. SQLAlchemy chama isso de Relacionamento de Lista de Adjacência e eu recomendo tentar seguir o código lá:
http://docs.sqlalchemy.org/en /rel_0_9/orm/relationships.html#adjacency-list-relationships
A chave é o kwarg 'remote_side' lá.
Aqui está o porquê:o erro que você está recebendo é porque sua tabela de associação ('friends') tem duas chaves estrangeiras apontando para a tabela 'users':uma na coluna 'user_id' e outra na coluna 'friend_id'. SQLAlchemy tenta detectar automaticamente relacionamentos com base em chaves estrangeiras, mas falha porque não pode dizer em que direção o relacionamento vai. Então, se você tiver uma entrada na tabela 'amigos' assim
user_id : 1
friend_id : 2
SQLAlchemy não pode dizer se user_1 tem user_2 como amigo, ou vice-versa.
Se isso parece confuso, é. A amizade no sentido das redes sociais pode ser unijetiva , nesse caso user_1 ter amigo user_2 não significa que user_2 tem user_1 como amigo; ou pode ser bijetivo , caso em que os dois são equivalentes. Estou mostrando minha idade aqui, mas a primeira é representada pelo Livejournal, enquanto a segunda é representada pelo Facebook.
Eu não sei de cabeça como implementar um relacionamento unijetivo no SQLAlchemy. É um UNION ALL feio ou algo assim no MySQL.