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

相关问题