No tengo mucha experiencia con SQLAlchemy y tengo un problema que no puedo resolver. Intenté buscar y probé mucho código. 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 fenoscore de la madre es (por ejemplo) == 10
Como dije, probé mucho 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 .mother.phenoscore
a cada elemento al generar, 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 unión adicional), necesito este tipo de filtro más de una vez.
Incluso si no hay una solución fácil, estoy feliz de obtener todas las respuestas.
fuente
has()
admite tanto la expresión de condición como argumento sin nombre como los argumentos defilter_by
palabra clave -style. La última me parece más legible.phenoscore = 10
.filter_by
solo toma palabras clave de igualdad (ya que solo les hace ** kwargs)Tienes que consultar las relaciones con join
Obtendrá el ejemplo de estas Estrategias de consulta autorreferenciales
fuente
Lo usé con sesiones, pero una forma alternativa en la que puede acceder al campo de relación directamente es
No lo he probado, pero supongo que esto también funcionaría
fuente
Buenas noticias para ti: recientemente hice un paquete que te permite filtrar / ordenar con cadenas "mágicas" como en Django , por lo que ahora puedes escribir algo como
Es mucho más corto, especialmente para filtros complejos, digamos,
Espero que disfrutes de este paquete
https://github.com/absent1706/sqlalchemy-mixins#django-like-queries
fuente
Esta es una respuesta más general sobre cómo consultar relaciones.
Esto le permite:
fuente