2016-11-11 21 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") 

如果你不想做,你可以修改查詢不靠關係定義。

相關問題