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)

結果一致
在這裏插入圖片描述

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