query primaryjoin order_by example back_populates filter sqlalchemy foreign-key-relationship

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)



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)