SQLAlchemy 关系自省
我有两个映射类,它们之间有一种一对多的关系:
class Part(...):
product = relationship('products', backref=backref('parts'))
class Product(...):
pass
给定 Part.product
,我可以查看这个关系,也就是说,我可以获取属性的名称,还可以获取反向引用的属性名称:
>>> rel = Part.product # image it's passed in as a function parameter
>>> rel.property.key
'product'
>>> rel.property.backref[0]
'parts'
我也可以反过来访问这个关系:
>>> rel = Product.parts
>>> rel
<sqlalchemy.orm.attributes.InstrumentedAttribute object at 0x3744fd0>
>>> rel.property.key
'parts'
但是,我找不到如何访问原始属性名称(也就是反向引用的反向引用属性,也就是例子中的'product'):
>>> rel.property.backref is None
True
我需要在哪里进行操作才能从 Product.parts
中获取到 'product'
呢?
1 个回答
4
我尝试重现你描述的情况,发现 Product.parts.property.backref = None
也是这样。经过在 PyCharm 中调试,我发现另一个属性保存了 parts 中属性的名称:
print Product.parts.property.backref
>>>None
print Product.parts.property.back_populates
>>>product
我建议在这种情况下考虑使用 back_populates
,这算是一种变通方法。
关于 back_populates 的详细信息可以在 文档中找到,标题是“链接关系配置:带有 Backref 的关系”。根据文档,你需要这样定义你的模型:
class Part(...):
product = relationship('products', back_populates='parts')
class Product(...):
parts = relationship('products', back_populates='product')
pass