我应该运行什么SQLAlchemy Query来遍历这个反向引用?

时间:2016-11-11 05:04:37

标签: python orm sqlalchemy

我有以下3个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的实例 - 符合以下两个条件:

  1. ba
  2. 的子记录
  3. b是MyClassC实例的子记录,其my_field2 == "Hello"
  4. 如果没有记录满足这些条件,则抛出异常。 我怎么能用几行紧凑的代码呢?

1 个答案:

答案 0 :(得分:2)

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")

如果您不想这样做,可以修改查询,使其不依赖于关系定义。