模型类
# 多对多
# 创建中间表
article_tag = db.Table(
"article_tag",
db.Column("article_id", db.Integer, db.ForeignKey("article_model.id"), primary_key=True), # 一张表的外键
db.Column("tag_id", db.Integer, db.ForeignKey("tag_model.id"), primary_key=True) # 另一张表的外键
)
class ArticleModel(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(100), comment="文章名")
tag = db.relationship("TagModel", secondary=article_tag, backref=db.backref("article")) # 任意一张表声明关系
class TagModel(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(100), comment="标签名")
多对多查
from flask import Blueprint
from flask_restful import Api, Resource
from model.model import StuModel, SubModel, db, ArticleModel, TagModel
stu_bp = Blueprint("stu_bp", __name__, url_prefix="/stu")
api = Api(stu_bp)
class StuView(Resource):
def get(self):
"""多对多添加数据"""
# 一次性把文章和标签全部添加进去
# t1 = TagModel(name="python")
# t2 = TagModel(name="人工智能")
#
# a1 = ArticleModel(name="人工智能的前景")
# a1.tag.append(t1)
# a1.tag.append(t2)
#
# db.session.add(a1)
# db.session.commit()
# t3 = TagModel.query.filter(TagModel.name == "python").first()
# a2 = ArticleModel(name="深拷贝浅拷贝的区别")
# a2.tag.append(t3)
# db.session.add(a2)
# db.session.commit()
# t3 = TagModel.query.filter(TagModel.name == "python").first()
# t4 = TagModel.query.filter(TagModel.name == "人工智能").first()
# a3 = ArticleModel.query.get(1)
#
# a3.tag.remove(t3)
# a3.tag.append(t4)
#
# db.session.commit()
# 知道一条数据,查询相关数据
# a4 = ArticleModel.query.get(1)
# tag_list = a4.tag
# print(tag_list)
#
t4 = TagModel.query.get(2)
article_list = t4.article
print(article_list)
return ""
api.add_resource(StuView, "/stu")
一对多增删改查
from flask import Blueprint
from flask_restful import Api, Resource
from model.model import StuModel, SubModel, db, ArticleModel, TagModel
stu_bp = Blueprint("stu_bp", __name__, url_prefix="/stu")
api = Api(stu_bp)
class StuView(Resource):
def get(self):
"""一对多添加数据"""
# 添加专业
# s = SubModel(name="python")
# s = SubModel(name="大数据")
# s = SubModel.query.get(1)
# 添加学生
# stu = StuModel(name="李四", sub=s)
# db.session.add(stu)
# db.session.commit()
# 一对多直接传入id添加
# sub = SubModel.query.get(1)
# # stu = StuModel(name="小明", sub=sub)
#
# stu = StuModel(name="lisa", sub_id=sub.id)
# db.session.add(stu)
# db.session.commit()
"""一对多修改数据"""
# 1.先查询到课程内容
# s = SubModel.query.get(1)
# # 2.再查询到学生
# stu = StuModel.query.filter(StuModel.name == "张三").first()
# # 3.调用主表中的sub别名等于新值
# stu.sub = s
# db.session.commit()
"""一对多查询数据"""
# # 通过一方多查 通过专业查学生 正向查询
# sub = SubModel.query.get(1)
#
# stu = sub.stu # stu是字段
# print(stu) # [<StuModel 1>, <StuModel 3>]
# print(type(stu)) # <class 'sqlalchemy.orm.collections.InstrumentedList'>
# 通过多方查一方 通过学生查专业 反向查询
stu = StuModel.query.filter(StuModel.name == "张三").first()
sub = stu.sub.name
print(sub) # python
return ""
api.add_resource(StuView, "/stu")