我想获得一个类的实例,该字段是一个外键过滤,但是当我尝试这样做时,我总是获取数据库中的所有条目,而不是符合标准的那些。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(以防万一它是有关)
预先感谢您!
我得到与解决方案怪异的行为。我仍然可以获得数据库中所有“WhateverClass”的实例,但是如果我输出whateverClassInstance.containerClassId,则它会为所有这些实例指定“5”。但事实并非如此......只有少数的WhateverClass(es)有一个containerClassId == 5(比如300中的3个......我得到了300个实例,并且根据输出,300有一个whateverClassInstance .containerClassId == 5 ...但这不是MySQL查询浏览器所说的)。不过,谢谢你的帮助。 – BorrajaX 2011-02-13 19:04:47