二级联接Sqlalchemy

问题描述 投票:0回答:1

我有三个Model类,代表我的PostgreSQL数据库中的三个表:Project,Label,ProjectLabel。许多项目可以具有多个标签:

class Project(db.Model):
    __tablename__ = 'projects'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String())
    labels = db.relationship('ProjectLabel')

class Label(db.Model):
    __tablename__ = 'labels'

    label_id = db.Column(db.Integer, primary_key=True)
    label_name = db.Column(db.String())

class ProjectLabel(db.Model):
    __tablename__ = 'projects_labels'

    projectlabel_id = db.Column(db.Integer, primary_key=True)
    projectlabel_projectid = db.Column(db.Integer, db.ForeignKey('projects.id'))
    projectlabel_labelid = db.Column(db.Integer, db.ForeignKey('labels.label_id'))

如何查询项目模型,以便可以从labels表中获取对象?

具体地说,如何获得分配给项目的标签的label_name?我以某种方式需要在Project(labels)-> ProjectLabel-> Label classes

之间进行连接
postgresql sqlalchemy flask-sqlalchemy
1个回答
0
投票

这将获得长格式的相关标签:

db.session.query(Project.id,
                 Label.label_name)\
          .filter(ProjectLabel.projectlabel_projectid==Project.id)\
          .filter(Label.label_id==ProjectLabel.projectlabel_labelid)\
          .order_by(Project.id.asc()).all()

如果要用逗号分隔列表中的标签,请使用func.group_concat()

db.session.query(Project.id,
                 func.group_concat(Label.label_name).label('related_labels'))\
          .filter(ProjectLabel.projectlabel_projectid==Project.id)\
          .filter(Label.label_id==ProjectLabel.projectlabel_labelid)\
          .group_by(Project.id)\
          .order_by(Project.id.asc()).all()
© www.soinside.com 2019 - 2024. All rights reserved.