Sqlalchemy中Model和Table需要联表查询问题解决

遇到的问题是,在已经建好的table和modle上怎么做联表,假设表结构如下,ClassA和ClassB是多对多关系

a2b = db.Table(
    'a2b',
    db.Column('a_id', db.Integer(), db.ForeignKey('classa.id')),
    db.Column('b_id', db.Integer(), db.ForeignKey('classb.id'))
)

class ClassA(db.Model):
    __tablename__ = "classa"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(64))
    
class ClassB(db.Model):
    __tablename__ = "classb"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(64))
    classas = db.relationship('ClassA', secondary=a2b, backref=db.backref('classb', lazy='dynamic'))

正常是先知道ClassA,然后检索ClassB,现在有个需求是希望同时检索出多个ClassA相关的多个ClassB,然后分页展示,查资料发现table类型可能无法参与查询,解决方案如下

// 已知一堆classa的id
classa_ids = [1,2,3,4] 
rets = []
objs = db.session.query(ClassB)
for _id in classa_ids:
    c = db.session.query(ClassA).filter(ClassA.id==_id).first()
    if not c:
        continue
    rets.append(c.classb.with_entities(ClassB.id.label('cid')))

if len(rets) == 1:
    tmp = rets[0].subquery()
elif len(rets) > 1:
    tmp = rets[0].union(*rets[1:]).subquery()
    
if len(rets) >= 1: 
    objs = objs.join(tmp, ClassB.id==tmp.c.cid)
objs.all()
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值