filter - primaryjoin - sqlalchemy relationship order_by
SqlAlchemy: filtrado por atributo de relaciĆ³n (4)
No tengo mucha experiencia con SQLAlchemy y tengo un problema que no puedo resolver, pero estoy buscando un código de prueba. Esta es mi clase (reducida al código más significativo):
class Patient(Base):
__tablename__ = ''patients''
id = Column(Integer, primary_key=True, nullable=False)
mother_id = Column(Integer, ForeignKey(''patients.id''), index=True)
mother = relationship(''Patient'', primaryjoin=''Patient.id==Patient.mother_id'', remote_side=''Patient.id'', uselist=False)
phenoscore = Column(Float)
y me gustaría consultar a todos los pacientes, cuyo fenometro de la madre es (por ejemplo) == 10
Como dije, probé un montón de código, pero no lo entiendo. La solución lógica, en mi opinión, sería
patients = Patient.query.filter(Patient.mother.phenoscore == 10)
porque, puede acceder a .mother.phenoscore para cada elemento al realizar la salida, pero este código no lo hace. ¿Existe una posibilidad (directa) de filtrar por un atributo de una relación (sin escribir la declaración SQL, o una declaración de combinación adicional), necesito este tipo de filtro más de una vez.
Incluso si no hay una solución fácil, estoy contento con todas las respuestas
muchas gracias Christo
El método de uso has()
relación (más legible):
patients = Patient.query.filter(Patient.mother.has(phenoscore=10))
o unirse (generalmente más rápido):
patients = Patient.query.join(Patient.mother, aliased=True)/
.filter_by(phenoscore=10)
Tienes que consultar el relationsip con join
Obtendrás el ejemplo de estas estrategias de consulta autorreferencial
Buenas noticias para ti: Hace poco hice un paquete que te da filtrado / clasificación con cadenas "mágicas" como en Django , así que ahora puedes escribir algo como
Patient.where(mother___phenoscore=10)
Es mucho más corto, especialmente para filtros complejos, por ejemplo,
Comment.where(post___public=True, post___user___name__like=''Bi%'')
Espero que disfrutes este paquete
https://github.com/absent1706/sqlalchemy-mixins#django-like-queries
Lo usé con sesiones, pero una forma alternativa en la que puedes acceder directamente al campo de relación es
db_session.query(Patient).join(Patient.mother) /
.filter(Patient.mother.property.mapper.class_.phenoscore==10)
No lo he probado, pero supongo que esto también funcionaría
Patient.query.join(Patient.mother) /
.filter(Patient.mother.property.mapper.class_.phenoscore==10)