6

我想獲得一個類的實例,該字段是一個外鍵過濾,但是當我嘗試這樣做時,我總是獲取數據庫中的所有條目,而不是符合標準的那些。SqlAlchemy - 按字段過濾定義爲ForeignKey

比方說,我有幾個類在簡單關係N:1中使用聲明性基礎。我有一個模擬像:

#!/usr/bin/python2.6 
class ContainerClass(declarativeBase): 
    __tablename__ = "container_classes" 
    _id = Column("id", Integer, primary_key=True) 
    id = sqlalchemy.orm.synonym('_id', descriptor=property(getId, setId)) 


class WhateverClass(declarativeBase): 
    __tablename__ = "whatever_classes" 

    _id = Column("id", Integer, primary_key=True) 
    _total = Column("total", Integer) 
    _containerClassId = Column("container_class_id", Integer, ForeignKey("other_classes.id")) 

    _containerClass = relationship("ContainerClass", uselist=False) 

    id = sqlalchemy.orm.synonym('_id', descriptor=property(getId, setId)) 
    total = sqlalchemy.orm.synonym('_total', descriptor=property(getTotal, setTotal)) 
    containerClassId = sqlalchemy.orm.synonym('_containerClassId', decriptor=property(getContainerClassId, setContainerClassId)) 
    containerClass = sqlalchemy.orm.synonym('_containerClass', descriptor=property(getContainerClass setContainerClass)) 

「WhateverClass」的實例可以屬於「ContainerClass」的一個實例(每個ContainerClass可以有WhateverClass的多個實例)。關係似乎工作正常。如果我向「ContainerClass」添加一個新的「WhateverClass」,那麼whateverClass.containerClassId會正確獲取它所屬的ContainerClass的值。

但是讓我們假設我需要獲取屬於「id = 5」的「ContainerClass」的「WhateverClass」實例列表。

如果我嘗試這樣做:

from myClasses import WhateverClass 
session.query(WhateverClass.WhateverClass).filter(WhateverClass.WhateverClass.containerClass.id == 5).all() 

我得到存儲在數據庫中的WhateverClass的所有實例,不僅誰是鏈接到ContainerClass id爲==的那些5

但如果我這樣做session.query(WhateverClass.WhateverClass).filter(總計< = 100).all()我正確地得到WhateverClass的「總」字段爲< = 100的實例。

我很新手sqlalchemy ...我必須使用加入的查詢或類似的東西?我知道它不會很複雜,但我一直無法找到任何合適的解決方案。我嘗試過加入,工會......但(顯然)我做錯了什麼。

我使用SQLAlchemy的0.6.6和Python 2.6(以防萬一它是有關)

預先感謝您!

回答

10

對於一個簡單的查詢,你可以直接查詢:

session.query(WhateverClass).filter(WhateverClass._containerClassId == 5).all() 

對於更復雜的關係,你需要一個連接:

session.query(WhateverClass).join(ContainerClass).filter(ContainerClass.id == 5).all() 
+0

我得到與解決方案怪異的行爲。我仍然可以獲得數據庫中所有「WhateverClass」的實例,但是如果我輸出whateverClassInstance.containerClassId,則它會爲所有這些實例指定「5」。但事實並非如此......只有少數的WhateverClass(es)有一個containerClassId == 5(比如300中的3個......我得到了300個實例,並且根據輸出,300有一個whateverClassInstance .containerClassId == 5 ...但這不是MySQL查詢瀏覽器所說的)。不過,謝謝你的幫助。 – BorrajaX 2011-02-13 19:04:47

相關問題