SQLAlchemy: получить отношения из db.Model

Мне нужно получить список свойств модели, которые на самом деле являются отношениями (т.е. они были созданы relationship()).

Скажем, у меня есть модель Foo в models:

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

Позже я хочу взять models.Thing и получить список свойств-отношений, то есть ['foo', 'bar'].

В настоящее время я проверяю каждый атрибут, указанный dir(models.Thing), который имеет тип sqlalchemy.orm.attributes.InstrumentedAttribute для класса его атрибута property, который может быть либо ColumnProperty, либо RelationshipProperty. Это делает работу, но мне было интересно, есть ли другой способ.

Я мог бы просто найти все атрибуты, заканчивающиеся на _id, и получить имя отношения, но это может сломаться для некоторых случаев.

Как насчет установки __relationships__ = ['foo', 'bar']?

Или есть что-то встроенное в SQLAlchemy, чтобы помочь мне?

Ответ 1

Это действительно так - взгляните на sqlalchemy.inspection.inspect. Вызов inspect на отображенный классе (например, ваш Thing класс) возвращает Mapper, который имеет relationships атрибут, который dict как:

from sqlalchemy.inspection import inspect

thing_relations = inspect(Thing).relationships.items()

Ответ 2

Вместо использования inspect вы также можете использовать

model.__mapper__.relationships

Ответ 3

Вам просто нужно использовать модуль inspect от sqlalchemy

from sqlalchemy import inspect

i = inspect(model)
i.relationships

Если вам нужен класс каждой упомянутой модели, вы можете сделать:

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