Como posso obter um relacionamento muitos-para-muitos auto-referenciado no SQLAlchemy ORM, referenciando novamente o mesmo atributo?
Estou tentando implementar um relacionamento auto-referencial muitos para muitos usando declarativo em SQLAlchem
O relacionamento representa amizade entre dois usuários. On-line, eu descobri (na documentação e no Google) como fazer um relacionamento m2m auto-referencial, onde as funções são diferenciadas. Isso significa que, nessas relações m2m, o Usuário A é, por exemplo, o chefe do UsuárioB, então ele o lista sob um atributo 'subordinados' ou o que você tem. Da mesma forma, o UsuárioB lista o UsuárioA em 'superiores'.
Isto não constitui problema, porque podemos declarar um backref para a mesma tabela desta maneira:
subordinates = relationship('User', backref='superiors')
Portanto, é claro, o atributo 'superiores' não é explícito dentro da class
De qualquer forma, aqui está o meu problema: e se eu quiser voltar ao mesmo atributo em que estou chamando o backref? Como isso
friends = relationship('User',
secondary=friendship, #this is the table that breaks the m2m
primaryjoin=id==friendship.c.friend_a_id,
secondaryjoin=id==friendship.c.friend_b_id
backref=??????
)
Isso faz sentido, porque se A faz amizade com B, os papéis de relacionamento são os mesmos e, se eu chamar os amigos de B, deveria ter uma lista com A. Este é o código problemático na íntegra:
friendship = Table(
'friendships', Base.metadata,
Column('friend_a_id', Integer, ForeignKey('users.id'), primary_key=True),
Column('friend_b_id', Integer, ForeignKey('users.id'), primary_key=True)
)
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
friends = relationship('User',
secondary=friendship,
primaryjoin=id==friendship.c.friend_a_id,
secondaryjoin=id==friendship.c.friend_b_id,
#HELP NEEDED HERE
)
Desculpe, se este é muito texto, eu só quero ser o mais explícito possível com isso. Não consigo encontrar nenhum material de referência para isso na Web.