遇到一个问题,文章类型是一个表,文章是一个表,中间表存放了其关系
逆向分析模型
这一个实体类模型
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)
结果一致