flask通过flask-sqlalchemy三表查询通过连接中间表

遇到一个问题,文章类型是一个表,文章是一个表,中间表存放了其关系
在这里插入图片描述
逆向分析模型
在这里插入图片描述
这一个实体类模型
models.py

from main import db


class Base(db.Model):
    """基类"""
    # 作为父类被继承,不会被创建成表(抽象)
    __abstract__ = True
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)

    def save(self):
        db.session.add(self)
        db.session.commit()

    def delete(self):
        db.session.delete(self)
        db.session.commit()

    def update(self):
        db.session.commit()

class Type(Base):
    __tablename__ = "type"
    name = db.Column(db.String(32),nullable=True) # 类型名
    description = db.Column(db.Text,nullable=True) # 描述

class Article(Base):
    __tablename__ = "article"
    title = db.Column(db.String(32),nullable=True) # 标题
    date = db.Column(db.DateTime,nullable=True) # 发表时间
    content = db.Column(db.Text,nullable=True) # 内容
    description = db.Column(db.Text,nullable=True) # 描述
    author_id  = db.Column(db.Integer,db.ForeignKey("author.id"),nullable=True) # 所属作者id
    types = db.relationship("Type", secondary="article_type", backref="articles")

class Author(Base):
    __tablename__ = "author"
    name = db.Column(db.String(32), nullable=True)  # 作者
    gender = db.Column(db.String(32), nullable=True)  # 性别
    age  = db.Column(db.Integer,nullable=True) # 年龄
    email = db.Column(db.String(254),nullable=True)
    articles = db.relationship("Article",backref="author")

# 创建中间表
article_type = db.Table(
    "article_type", # 中间表名称
    db.Column("id",db.Integer,primary_key=True,autoincrement=True), # 主键
    db.Column("article_id",db.Integer,db.ForeignKey("article.id")), # 属性 外键
    db.Column("type_id",db.Integer,db.ForeignKey("type.id")), # 属性 外键
)


下图为两表数据内容
在这里插入图片描述
查询每中文章类型,有多少篇文章
方案一:

@userbl.route("/select/type/number/")
def select_type_number():
    """查找文章类型和类型下书的数量"""
    type_count = db.session.query(Type.name,func.count(article_type)).group_by(Type.name).all()
    article_type_list = Type.query.all()
    result = []
    for article_type1 in article_type_list:
        ret = len(article_type1.articles)
        result.append({"type_name": article_type1.name, "count": ret})
    return "文章类型和类型下书的数量:{}".format(result)

方案二:

@userbl.route("/select/type/number/")
def select_type_number():
    """查找文章类型和类型下书的数量"""

    result = Article.query.join(article_type).join(Type).group_by(Type.name).with_entities(Type.name,func.count(Article.id)).all()
    return "文章类型和类型下书的数量:{}".format(result)

结果一致
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章