2013-01-18 51 views
2

我有兩個映射類有一個一對多的關係:SQLAlchemy的關係自省

class Part(...): 
    product = relationship('products', backref=backref('parts')) 

class Product(...): 
    pass 

鑑於Part.product,我可以反思這種關係,即獲取屬性名稱,並同時獲得backref屬性名稱:

>>> 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' 

不過,我無法找出如何(在本例又名backref」 backref屬性,又名‘產品’)訪問原始屬性名稱:

>>> rel.property.backref is None 
True 

我在哪裏有發癢Product.parts獲得'product'

回答

4

我試圖重現您描述的情況,並得到Product.parts.property.backref = None。 在pycharm調試後,我發現,其他財產擁有的財產部分的名稱:

print Product.parts.property.backref 
>>>None 
print Product.parts.property.back_populates 
>>>product 

我建議考慮在這種情況下,一個黑客使用back_populates

back_populates在documentation Linking Relationship Configuration:Relationships with Backref中描述。根據文檔,你需要定義你的模型那樣:

class Part(...): 
    product = relationship('products', back_populates='parts') 

class Product(...): 
    parts = relationship('products', back_populates='product') 
    pass 
+0

真棒,正是我需要的:-)我甚至不認爲這是一個黑客,它看起來像規範的方法來查找屬性名稱(backref是設置back_populates的快捷方式)。謝謝你解決這個問題! – Simon