Wzorzec, który próbujesz zaimplementować, to szczególny przypadek relacji wiele-do-wielu. SQLAlchemy nazywa to relacją listy sąsiedztwa i zalecam spróbowanie prześledzenia zawartego tam kodu:
http://docs.sqlalchemy.org/en /rel_0_9/orm/relationships.html#adjacency-list-relationships
Kluczem jest tam kreg 'remote_side'.
Oto dlaczego:błąd, który otrzymujesz, jest spowodowany tym, że tabela asocjacyjna ('friends') ma dwa klucze obce wskazujące na tabelę 'users':jeden w kolumnie 'user_id' i jeden w kolumnie 'friend_id'. SQLAlchemy próbuje automatycznie wykryć relacje na podstawie kluczy obcych, ale kończy się to niepowodzeniem, ponieważ nie może stwierdzić, w którym kierunku zmierza relacja. Więc jeśli masz wpis w tabeli „przyjaciele” jak tak
user_id : 1
friend_id : 2
SQLAlchemy nie może stwierdzić, czy użytkownik_1 ma user_2 jako przyjaciela, czy odwrotnie.
Jeśli to wydaje się mylące, to tak. Przyjaźń w sensie sieci społecznościowych może być jednoznaczna , w takim przypadku user_1 posiadanie przyjaciela user_2 nie oznacza, że user_2 ma user_1 jako przyjaciela; lub może być bijective , w takim przypadku oba są równoważne. Pokazuję tutaj swój wiek, ale pierwszy jest reprezentowany przez Livejournal, a drugi przez Facebooka.
Nie wiem, jak zaimplementować relację unijective w SQLAlchemy. To brzydkie UNION ALL lub coś takiego w MySQL.