6

Estoy tratando de obtener instancias de una clase filtradas por un campo que es una clave externa, pero cuando intento hacerlo, siempre obtengo todas las entradas en la base de datos, en lugar de los que coinciden con el criterio.SqlAlchemy - Filtrado por campo definido como ForeignKey

Digamos que tengo un par de clases usando una base declarativa en una relación simple N: 1. que he modelada como:

#!/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)) 

Una instancia de "WhateverClass" puede pertenecer a una instancia de "ContainerClass" (y cada ContainerClass puede tener varias instancias de WhateverClass). La relación parece estar funcionando bien. Si agrego un nuevo "WhateverClass" a un "ContainerClass", el whateverClass.containerClassId obtiene el valor del ContainerClass al que pertenece.

Pero digamos que necesito obtener una lista de instancias de "WhateverClass" que pertenecen a "ContainerClass" cuya id == 5.

Si trato de hacer:

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

consigo todas las instancias de WhateverClass que se almacenan en la base de datos, no sólo los que están vinculados a la ContainerClass con id == 5

Pero si lo hago session.query (WhateverClass.WhateverClass) .filter (total < = 100) .all() Obtengo instancias de WhateverClass cuyo campo "total" es < = 100.

Soy bastante novato en sqlalchemy ... ¿Tengo que usar una consulta combinada o algo así? Sé que no puede ser complicado, pero no he podido encontrar ninguna solución adecuada. Intenté uniones, uniones ... Pero (obviamente) estoy haciendo algo mal.

estoy usando sqlalchemy 0.6.6 y Python 2.6 (sólo en caso de que sea relevante)

gracias de antemano!

Respuesta

10

Para una consulta simple, sólo puede consultar directamente:

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

Para las relaciones más complejas, se necesita una combinación:

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

me sale un comportamiento extraño con esa solución. Todavía tengo todas las instancias de "WhateverClass" que tengo en la base de datos, pero si imprimo el whateverClassInstance.containerClassId, dice "5" para todas ellas. Pero eso no es verdad ... Solo unos pocos de WhateverClass (es) tienen un containerClassId == 5 (como 3 de ellos de 300 ... Obtengo las 300 instancias, y, de acuerdo con la salida, los 300 tienen unaClassInstance .containerClassId == 5 ... pero eso no es lo que dice el navegador de consultas MySQL). Gracias por tu ayuda, sin embargo. – BorrajaX

+1

Actualización: Soy estúpido ... Tonto, tonto, tonto ... Fui a través de todos los registros en mi base de datos y resultó que estaba teniendo mucho más WhateverClass en el ContainerClass con id == 5 de lo que pensaba !! ! ¡Estaba trabajando desde gecko! Gracias de nuevo... – BorrajaX

Cuestiones relacionadas