SQLAlchemy:从db.Model获取关系

mal*_*ree 14 python sqlalchemy

我需要获得模型属性的列表,这些属性实际上是关系(也就是说,它们是由它们创建的relationship()).

说我有一个模型Foomodels:

class Thing(db.Model):
    id = db.Column(...)
    bar_id = db.Column(...)
    foo_id = db.Column(...)
    foo = db.relationship('Foo')
    bar = db.relationship('Bar')
Run Code Online (Sandbox Code Playgroud)

稍后,我想models.Thing获取一个关系属性列表,即['foo', 'bar'].

目前我正在检查其所指示的每个属性dir(models.Thing)恰好是sqlalchemy.orm.attributes.InstrumentedAttributeproperty属性类的类型- 可以是a ColumnPropertyRelationshipProperty.这样做的工作,但我想知道是否有另一种方式.

我可能只是找到所有属性结束_id并导出关系名称,但在某些情况下这可能会中断.

设置一个__relationships__ = ['foo', 'bar']怎么样?

或者SQLAlchemy中有什么内容可以帮助我吗?

Sea*_*ira 23

的确有 - 看一看sqlalchemy.inspection.inspect.调用inspect映射类(例如,您的Thing类)将返回一个Mapper具有以下relationships属性的属性:

from sqlalchemy.inspection import inspect

thing_relations = inspect(Thing).relationships.items()
Run Code Online (Sandbox Code Playgroud)


Poo*_*oja 11

而不是使用inspect你也可以使用

model.__mapper__.relationships


Rod*_*nza 8

您只需要使用该inspect模块sqlalchemy

from sqlalchemy import inspect

i = inspect(model)
i.relationships
Run Code Online (Sandbox Code Playgroud)

如果您需要每个推荐模型的类,您可以:

referred_classes = [r.mapper.class_ for r in i.relationships]
Run Code Online (Sandbox Code Playgroud)