SQLAlchemy:从db.Model获取关系

时间:2014-01-18 16:36:41

标签: python sqlalchemy

我需要获取模型属性的列表,这些属性实际上是关系(也就是说,它们是由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所指示的每个属性,该属性可以是ColumnPropertyRelationshipProperty。这样做了,但我想知道是否还有另一种方式。

我可能只是找到以_id结尾的所有属性并派生关系名称,但在某些情况下这可能会中断。

如何设置__relationships__ = ['foo', 'bar']

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

3 个答案:

答案 0 :(得分:23)

确实 - 看看sqlalchemy.inspection.inspect。在映射的类(例如,您的inspect类)上调用Thing将返回Mapper,其dict属性为from sqlalchemy.inspection import inspect thing_relations = inspect(Thing).relationships.items() ,如:< / p>

{{1}}

答案 1 :(得分:9)

您也可以使用

代替inspect

model.__mapper__.relationships

答案 2 :(得分:6)

您只需使用inspect

中的sqlalchemy模块即可
from sqlalchemy import inspect

i = inspect(model)
i.relationships

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

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