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]