1. # 角色表模型
    class Role(db.Model):
    r_id = db.Column(db.Integer, primary_key=True)
    r_name = db.Column(db.String(10))
    __tablename__ = 'role'
  2.  
  3. # 角色表和权限表的中间表
    # r_p为关联表的表名
    r_p = db.Table('r_p',
    db.Column('role_id',db.Integer,db.ForeignKey('role.r_id'),primary_key=True),
    db.Column('permission_id', db.Integer, db.ForeignKey('permission.p_id'),primary_key=True)
    )
  4.  
  5. # 权限表模型
    class Permission(db.Model):
    p_id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    p_name = db.Column(db.String(16), unique=True)
    p_er = db.Column(db.String(16), unique=True)
      # 添加多对多的反向引用,必须用secondary指定中间关联表
      # 用权限查询角色时用查询到的权限对象:“权限对象.roles.all()”得到其对应的所有角色
    roles =db.relationship('Role', secondary = r_p, backref = db.backref('permission', lazy = True))
    __tablename__ = 'permission'
      # db.backref('permission', 中的permission用来反向关联,用角色查询其对应的所有权限。用查询到的 '角色对象.permission.all()'得到。
    # relationship可以放到任意一个类中都行,与之相反。
  1. views视图函数:
  1. # 多对多查询
  2.  
  3. @user.route('/userperlist/', methods=['GET', 'POST'])
  4. @is_login
  5. def userperlist():
  6.   # 首先获得主表角色的ID
  7. r_id = request.args.get('r_id')
  8.   # 使用ID来获取该角色对象
  9. roles = Role.query.get(r_id)
  10. # 然后通过角色,找权限
  11. pers = roles.permission
  12.  
  13. #多对多添加
  14. # 权限管理/角色列表/添加权限
  15. @user.route('/adduserper/', methods=['GET', 'POST'])
  16. @is_login
  17. def adduserper():
  18. r_id = request.args.get('r_id')
  19. permissions = Permission.query.all()
  20. if request.method == 'GET':
  21. return render_template('add_user_per.html',permissions = permissions)
  22. if request.method == 'POST':
  23. p_id = request.form['p_id']
  24.      # 找出对应权限
  25.      # 此处用get(id)获取, 不要使用filter_by
  26.     # 对多关系中获取对象,只能用get(id)方法,不能通过filter或者filter_by来获取
  27. permission = Permission.query.get(p_id)
  28.      # 找出对应角色
  29. role = Role.query.get(r_id)
  30.      # 然后添加权限
  31. role.permission.append(permission)
  32.      # 保存数据库
  33. db.session.commit()
  34. return redirect(url_for('user.roles'))
  35.  
  36. #多对多删除
  37. # 权限管理/角色列表/减少权限
  38. @user.route('/subuserper/', methods=['GET', 'POST'])
  39. @is_login
  40. def subuserper():
  41. r_id = request.args.get('r_id')
  42. roles = Role.query.get(r_id)
  43. pers = roles.permission
  44. if request.method == 'GET':
  45. return render_template('user_per_list.html',pers=pers)
  46. if request.method == 'POST':
  47. p_id = request.form['p_id']
  48. permission = Permission.query.get(p_id)
  49. role = Role.query.get(r_id)
  50.     # 和添加一样,只是此处用的是remove()
  51. role.permission.remove(permission)
  52. db.session.commit()
  53. return redirect(url_for('user.roles'))
  1. 总结:ORM操作时,多对多关系的角色权限表(中间关联表),不需要用户维护.
  1.  

flask中 多对多的关系 主从表之间的的增删改查的更多相关文章

  1. Django项目的创建与介绍.应用的创建与介绍.启动项目.pycharm创建启动项目.生命周期.三件套.静态文件.请求及数据.配置Mysql完成数据迁移.单表ORM记录的增删改查

    一.Django项目的创建与介绍 ''' 安装Django #在cmd中输入pip3 #出现这个错误Fatal error in launcher: Unable to create process ...

  2. mysql对库,表及记录的增删改查

    破解密码 #1.关闭mysqlnet stop mysqlmysql还在运行时需要输入命令关闭,也可以手动去服务关闭 #2.重新启动mysqld --skip-grant-tables跳过权限 #3m ...

  3. 第三百零七节,Django框架,models.py模块,数据库操作——表类容的增删改查

    Django框架,models.py模块,数据库操作——表类容的增删改查 增加数据 create()方法,增加数据 save()方法,写入数据 第一种方式 表类名称(字段=值) 需要save()方法, ...

  4. 五 Django框架,models.py模块,数据库操作——表类容的增删改查

    Django框架,models.py模块,数据库操作——表类容的增删改查 增加数据 create()方法,增加数据 save()方法,写入数据 第一种方式 表类名称(字段=值) 需要save()方法, ...

  5. Oracle学习总结_day01_day02_表的创建_增删改查_约束

    本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! 更新: SELECT * FROM (SELECT R ...

  6. Java代码自动生成,生成前端vue+后端controller、service、dao代码,根据表名自动生成增删改查功能

    本项目地址:https://github.com/OceanBBBBbb/ocean-code-generator 项目简介 ocean-code-generator采用(适用):     ,并使用m ...

  7. 表结构修改以及sql增删改查

    修改表结构 修改表名 alter table 表名 rename 新名 增加字段 alter table 表名 add 字段名 数据类型 约束 删除字段 alter table 表名 drop 字段名 ...

  8. 如何搭建一个WEB服务器项目(二)—— 对数据库表进行基本的增删改查操作

    使用HibernateTemplate进行增删改查操作 观前提示:本系列文章有关服务器以及后端程序这些概念,我写的全是自己的理解,并不一定正确,希望不要误人子弟.欢迎各位大佬来评论区提出问题或者是指出 ...

  9. 数据库中的记录通过servlet回显到jsp页面中(连接数据库或者查询參照:对数据进行增删改查)

    我们常常会用到通过图书的名称来查询图书那么这种话我们也就会使用到从数据库中搜索出数据而且载入到自己的Jsp页面中 这种话我们须要将从数据库中获取到的数据放进响应中然后通过%=request.getAt ...

随机推荐

  1. Java设计模式之结构模式

    一.外观模式 分析:外观模式是为子系统的一组接口提供一个统一的界面,数据库JDBC连接应用就是外观模式的一个典型例子,特点:降低系统的复杂度,增加灵活性.结果:代码示例: public class D ...

  2. 小白学 Python 数据分析(12):Pandas (十一)数据透视表(pivot_table)

    人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...

  3. Java中如何更优雅的处理空值

    经常看到项目中存在到处空值判断的情况,这些判断,会让人觉得摸不着头绪,它的出现很有可能和当前的业务逻辑并没有关系.但它会让你很头疼.有时候,更可怕的是系统因为这些空值的情况,会抛出空指针异常,导致业务 ...

  4. 使用移动自适应布局+easy mock实现移动界面的简单实现

    一.使用easy mock模拟数据 easy mock链接地址 二.自己写移动自适应布局 自己编写主要是利用rem进行宽度栅格布局: html { /* 相当于一个界面适配器,pc以及移动端都可以进行 ...

  5. RNN学习笔记(一):长短时记忆网络(LSTM)

    一.前言 在图像处理领域,卷积神经网络(Convolution Nerual Network,CNN)凭借其强大的性能取得了广泛的应用.作为一种前馈网络,CNN中各输入之间是相互独立的,每层神经元的信 ...

  6. Python基础知识(day1)

    day1 1.编码 ASCII码 1字节8位 2^8 = 256 位 万国码 unicode 4字节32位 #浪费空间 UTF-8 对unicode进行压缩 2.注释 单行注释 score = inp ...

  7. 必备技能三、render渲染函数

    Vue 推荐使用在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编程的能力,这就是 render 函数,它比 template ...

  8. 数据挖掘入门系列教程(三)之scikit-learn框架基本使用(以K近邻算法为例)

    数据挖掘入门系列教程(三)之scikit-learn框架基本使用(以K近邻算法为例) 简介 scikit-learn 估计器 加载数据集 进行fit训练 设置参数 预处理 流水线 结尾 数据挖掘入门系 ...

  9. springcloud项目实现自定义权限注解进行接口权限验证

    一般在项目开发中会根据登录人员的权限大小对接口也会设置权限,那么对接口权限是怎么实现的呢,大多数都是用自定义权限注解,只需要在接口上加上一个注解就可以实现对接口的权限拦截,是否对该接口有权调用 接下来 ...

  10. 基于Canal和Kafka实现MySQL的Binlog近实时同步

    前提 近段时间,业务系统架构基本完备,数据层面的建设比较薄弱,因为笔者目前工作重心在于搭建一个小型的数据平台.优先级比较高的一个任务就是需要近实时同步业务系统的数据(包括保存.更新或者软删除)到一个另 ...