我有以下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
的实例 - 符合以下两个条件:
b
是a
b
是MyClassC实例的子记录,其my_field2 == "Hello"
如果没有记录满足这些条件,则抛出异常。 我怎么能用几行紧凑的代码呢?
答案 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")
如果您不想这样做,可以修改查询,使其不依赖于关系定义。