16、flask-模型-models-表的操作-多表操作-多对多
- 代码如下:
变化的只有models.py和views.py
models.py
""" 用户 : 电影 = N : M """ # 中间表 : 收藏电影的用户 collect = db.Table( 'collects', db.Column('user_id', db.Integer, db.ForeignKey('usermodel.id'), primary_key=True), #外键关联用户表的id db.Column('movie_id', db.Integer, db.ForeignKey('movie.id'), primary_key=True) #外键管理电影表的id ) #用户表 #用户可以收藏电影 class UserModel(db.Model): __tablename__ = 'usermodel' id = db.Column(db.Integer, primary_key=True, autoincrement=True) name = db.Column(db.String(50), unique=True) age = db.Column(db.Integer) #电影表 class Movie(db.Model): __tablename__ = 'movie' id = db.Column(db.Integer, primary_key=True, autoincrement=True) name = db.Column(db.String(50)) # 关联 # 第一个参数是关联的模型名(类名) # 第二个参数是反向引用的名称,grade对象、让student反过来得到grade对象的名称:student.grade # 第三个参数:懒加载,当调用时才去加载 # secondary 设置中间表 users = db.relationship('UserModel', backref='movies', lazy='dynamic', secondary=collect) ''' lazy:属性 - 懒加载:可以延迟在使用关联属性的时候才建立关联 lazy='dynamic' :会返回一个query对象(查询集), 可以继续使用其他查询方法、如all() lazy='select': 首次访问到属性的时候,就会全部加载该属性的数据 lazy='joined':在对关联的两个表进行join操作、从而获得所有相关的对象 lazy='True':返回一个可用的列表对象、通select '''
views.py
import random from flask import Blueprint, request, render_template from .models import * #创建蓝图(路由) blue = Blueprint('user', __name__) @blue.route('/') def index(): return 'index' # ---------------------------多对多--------------------------------- # 增 # 添加用户 @blue.route('/adduser/') def add_user(): users = [] for i in range(10, 14): user = UserModel() user.name = f'小新{i}' user.age = i users.append(user) try: db.session.add_all(users) db.session.commit() except Exception as e: print(e) db.session.rollback() db.session.flush() return '增加成功' # 添加电影 @blue.route('/addmovie/') def add_movie(): movies = [] for i in range(10, 14): movie = Movie() movie.name = f'阿凡达-{i}' movies.append(movie) try: db.session.add_all(movies) db.session.commit() except Exception as e: print(e) db.session.rollback() db.session.flush() return '增加成功' # 添加收藏 @blue.route('/addcollect/') def add_collect(): # 用户收藏电影 user = UserModel.query.get(1) movie = Movie.query.get(2) # 这里的movies是 models.py模型中的电影表中: # users = db.relationship('UserModel', backref='movies', lazy='dynamic', secondary=collect) # 可以通过movies属性来添加收藏电影 user.movies.append(movie) db.session.commit() return '增加成功' # 查询 @blue.route('/getcollect/') def get_collect(): # 查询某个用户收藏的电影 user = UserModel.query.get(1) print(user.movies) # 查询用户收藏的电影 # 查找手残了某电影的所有用户 movie = Movie.query.get(4) print(movie.users) print(list(movie.users)) return '查询成功' # 修改和单表操作一样 # 删除 @blue.route('/deluser/') def del_user(): # 级联删除 - 删除用户之后、相应的关联的collect表中的用户也会被删除 user = UserModel.query.get(1) db.session.delete(user) db.session.commit() return '删除成功'
本文作者:littlecc
本文链接:https://www.cnblogs.com/littlecc/p/18327463
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步