atributos de la relación de clave extranjera sqlalchemy

Tengo una mesa de usuario y una mesa de amigo. La tabla de amigos contiene dos claves externas tanto en mi tabla de usuario como en un campo de estado. Estoy intentando poder llamar a los atributos de mi tabla de usuario en un objeto amigo. Por ejemplo, me encantaría poder hacer algo como, friend.name o friend.email.

class User(Base): """ Holds user info """ __tablename__ = 'user' id = Column(Integer, primary_key=True) name = Column(String(25), unique=True) email = Column(String(50), unique=True) password = Column(String(25)) admin = Column(Boolean) # relationships friends = relationship('Friend', backref='Friend.friend_id',primaryjoin='User.id==Friend.user_id', lazy='dynamic') class Friend(Base): __tablename__ = 'friend' user_id = Column(Integer, ForeignKey(User.id), primary_key=True) friend_id = Column(Integer, ForeignKey(User.id), primary_key=True) request_status = Column(Boolean) 

Cuando obtengo los objetos de friend , todo lo que tengo son los 2 user_ids y quiero mostrar todas las propiedades de cada usuario para poder usar esa información en formularios, etc. Soy nuevo en sqlalchemy, aún intentando aprender características más avanzadas. Esto es solo un fragmento de un proyecto Flask más grande y esta característica será para solicitudes de friend , etc. He intentado buscar objetos de asociación, etc., pero estoy teniendo dificultades con eso.

Cualquier ayuda sería muy apreciada.

Primero, si estás usando flask-sqlalchemy , ¿por qué usas directamente sqlalchemy en lugar de db.Model del db.Model ?

Recomiendo encarecidamente usar la extensión flask-sqlalchemy ya que aprovecha las sesiones y algunas otras cosas interesantes.

Crear un objeto de conveniencia de proxy es sencillo. Solo agrega la relación con él en la clase Friend .

 class Friend(Base): __tablename__ = 'friend' user_id = Column(Integer, ForeignKey(User.id), primary_key=True) friend_id = Column(Integer, ForeignKey(User.id), primary_key=True) request_status = Column(Boolean) user = relationship('User', foreign_keys='Friend.user_id') friend = relationship('User', foreign_keys='Friend.friend_id') 

SQLAlchemy se encargará del rest y podrá acceder al objeto de usuario simplemente:

 name = friend.user.name 

Si planea usar el objeto de user cada vez que use el objeto friend especifique lazy='joined' en la relationship . De esta manera carga ambos objetos en una sola consulta.