2016-11-11 5 views
0

私は、次の3つのSQLAlchemyのモデルを持っている:ここではこの逆参照をトラバースするには、どのSQLAlchemyクエリを実行する必要がありますか?

class MyClassA(db.Model): 
     myclassa_id = db.Column(db.Integer, nullable=False, primary_key=True) 
     myfield_1 = db.Column(db.String(1024), nullable=True) 
     myclassbs = db.relationship("MyClassB", backref="myclassa") 

    class MyClassC(db.Model): 
     myclassc_id = db.Column(db.Integer, nullable=False, primary_key=True) 
     myfield_2 = db.Column(db.String(1024), nullable=False, unique=True) 

    class MyClassB(db.Model): 
     legal_document_content_format_id = db.Column(db.Integer, nullable=False, primary_key=True) 
     myclassa_id = db.Column(db.Integer, db.ForeignKey(MyClassA.myclassa_id), nullable=False) 
     myclassc_id = db.Column(db.Integer, db.ForeignKey(MyClassC.myclassc_id)) 
     myfield_3 = db.Column(db.String(1024)) 
     __table_args__ = (db.UniqueConstraint('myclassa_id', 'myclassc_id', name='unique_constraint_mcaid_mccid'),) 

は、私が何をしたいです:

は、私がaがあると - MyClassAのインスタンスを。

私はbを返すようにしたい - MyClassBのインスタンス - 以下の2つの条件を満たしている:

  1. ba
  2. bの子レコードがMyClassCのインスタンスの子レコードですそれはmy_field2 == "Hello"

が該当しない場合は例外をスローします。 これをコードのいくつかのコンパクトな行でどうすればいいですか?

答えて

1
q = (
    db.session.query(MyClassB) 
    .join(MyClassA) # this will satisfy first criteria 
    .join(MyClassC) # criteria 2 part 1 
    .filter(MyClassC.my_field2 == "Hello") # criteria 2 part2 
) 

b_list = q.all() 
assert b_list 

しかし、あなたはまた、BとCの間の関係を追加する必要があり、これが機能するためには:

class MyClassC(db.Model): 
    # ... 
    myclassbs = db.relationship("MyClassB", backref="myclassc") 

あなたがそれを行うにはしたくない場合は、あなたが関係に依存しないようにクエリを変更することができます定義。

関連する問題