2011-12-19 13 views
49

SQLAlchemyにはあまり経験はありません。問題は解決できませんが、多くのコードを検索しています。 これは私のクラスである(最も重要なコードに縮小):SqlAlchemy - リレーションシップ属性によるフィルタリング

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) 

と私が言われたよう母親のphenoscoreである(例えば)== 10

すべての患者を、照会したいと思い、私が試しました多くのコードが、私はそれを得ることはありません。論理的ソリューションは、私の目には、このコードはそれをしない、出力する際に​​は、各要素に対して.mother.phenoscoreにアクセスすることができ、ため

patients = Patient.query.filter(Patient.mother.phenoscore == 10) 

ことだろうが。 リレーションシップの属性(SQLステートメントを書くことなく、または余分なjoinステートメントなし)でフィルタリングする(直接的に)可能性がありますが、この種のフィルタが必要です。

簡単な解決策が存在しない場合でも、私はすべての答えについて幸せです

おかげでたくさん クリスト

答えて

88

使用方法(より読みやすい)関係のhas()

patients = Patient.query.filter(Patient.mother.has(phenoscore=10)) 

または参加(通常より速い):

patients = Patient.query.join(Patient.mother, aliased=True)\ 
        .filter_by(phenoscore=10) 
+5

患者= Patient.query.filter(Patient.mother.has(Patient.phenoscore == 1を働くだろう0)) – user1105851

+0

@ user1105851 'has()'は、無名引数として条件式と 'filter_by'-styleキーワード引数の両方をサポートします。後で私にはより読みやすいようです。 –

+0

@DenisOtkidachは正しいが、それは 'phenoscore = 10'となる。 'filter_by'は等価のキーワードしか取っていません(それで** kwargsを実行しているので) – aruisdante

2

グッドニュースあなたのために:私は最近、あなたが「魔法」の文字列as in Djangoでソート/フィルタリングできますパッケージを作ったので、あなたが今

ような何かを書くことができます
Patient.where(mother___phenoscore=10) 

それは、たとえば、特に複雑なフィルタのために、多くの短い方だ

Comment.where(post___public=True, post___user___name__like='Bi%') 

ホーあなたはこのパッケージ

https://github.com/absent1706/sqlalchemy-mixins#django-like-queries

1

をお楽しみいただけますPE私はセッションでそれを使用していますが、関係フィールドにアクセスできる別の方法は、直接、私はそれをテストしていない

db_session.query(Patient).join(Patient.mother) \ 
    .filter(Patient.mother.property.mapper.class_.phenoscore==10) 

ですが、私は推測しますこれはまた、

Patient.query.join(Patient.mother) \ 
    .filter(Patient.mother.property.mapper.class_.phenoscore==10) 
関連する問題