SQLAlchemy 关系自省

2 投票
1 回答
539 浏览
提问于 2025-04-17 13:14

我有两个映射类,它们之间有一种一对多的关系:

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

撰写回答