Não tenho muita experiência com SQLAlchemy e estou com um problema que não consigo resolver. Tentei pesquisar e tentei muitos códigos. Esta é minha classe (reduzida ao código mais 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)
e gostaria de consultar todos os pacientes, cujo phenoscore da mãe é (por exemplo) == 10
Como disse, tentei muitos códigos, mas não entendi. A solução lógica, a meu ver, seria
patients = Patient.query.filter(Patient.mother.phenoscore == 10)
porque, você pode acessar .mother.phenoscore
para cada elemento durante a saída, mas, este código não faz isso.
Existe a possibilidade (direta) de filtrar por um atributo de um relacionamento (sem escrever a instrução SQL ou uma instrução extra de junção), preciso desse tipo de filtro mais de uma vez.
Mesmo que não haja uma solução fácil, fico feliz em obter todas as respostas.
fonte
has()
suporta expressão de condição como argumento sem nome efilter_by
argumentos de palavra-chave -style. O último parece mais legível para mim.phenoscore = 10
.filter_by
só aceita palavras-chave de igualdade (já que está apenas fazendo ** kwargs nelas)Você tem que consultar a relação com o join
Você obterá o exemplo deste Auto-Referential Query Strategies
fonte
Eu usei com sessões, mas uma forma alternativa de acessar o campo de relacionamento diretamente é
Não testei, mas acho que também funcionaria
fonte
Boas notícias para você: recentemente fiz um pacote que fornece filtragem / classificação com strings "mágicas" como no Django , então agora você pode escrever algo como
É muito mais curto, especialmente para filtros complexos, digamos,
Espero que você goste deste pacote
https://github.com/absent1706/sqlalchemy-mixins#django-like-queries
fonte
Esta é uma resposta mais geral sobre como consultar relacionamentos.
Isso permite que você:
fonte