SQLAlchemy: obtener relaciones de un db.Model

Necesito obtener una lista de las propiedades de un modelo que en realidad son relaciones (es decir, fueron creadas por relationship() ).

Digamos que tengo un modelo Foo en unos models :

 class Thing(db.Model): id = db.Column(...) bar_id = db.Column(...) foo_id = db.Column(...) foo = db.relationship('Foo') bar = db.relationship('Bar') 

Más adelante, quiero tomar models.Thing una lista de propiedades de relación, que es ['foo', 'bar'] .

Actualmente, estoy comprobando todos los atributos indicados por dir(models.Thing) que son del tipo sqlalchemy.orm.attributes.InstrumentedAttribute para la clase de su atributo de property , que puede ser ColumnProperty o RelationshipProperty . Esto hace el trabajo pero me preguntaba si hay otra manera.

Probablemente podría encontrar todos los atributos que terminan en _id y derivar el nombre de la relación, pero esto podría fallar en algunos casos.

¿Qué tal si configuramos __relationships__ = ['foo', 'bar'] ?

¿O hay algo integrado en SQLAlchemy para ayudarme?

De hecho, hay que echar un vistazo a sqlalchemy.inspection.inspect . Al llamar a inspect en una clase asignada (por ejemplo, tu clase Thing ) devolverá un Mapper , que tiene un atributo de relationships :

 from sqlalchemy.inspection import inspect thing_relations = inspect(Thing).relationships 

En lugar de usar inspect también puedes usar

model.__mapper__.relationships

Solo necesitas usar el módulo de inspect de sqlalchemy

 from sqlalchemy import inspect i = inspect(model) i.relationships 

Si necesita la clase de cada modelo referido puede hacer:

 referred_classes = [r.mapper.class_ for r in i.relationships]