# 角色表模型
class Role(db.Model):
r_id = db.Column(db.Integer, primary_key=True)
r_name = db.Column(db.String(10))
__tablename__ = 'role' # 角色表和权限表的中间表
# 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)
) # 权限表模型
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可以放到任意一个类中都行,与之相反。
views视图函数:
# 多对多查询

@user.route('/userperlist/', methods=['GET', 'POST'])
@is_login
def userperlist():
  # 首先获得主表角色的ID
r_id = request.args.get('r_id')
  # 使用ID来获取该角色对象
roles = Role.query.get(r_id)
# 然后通过角色,找权限
pers = roles.permission #多对多添加
# 权限管理/角色列表/添加权限
@user.route('/adduserper/', methods=['GET', 'POST'])
@is_login
def adduserper():
r_id = request.args.get('r_id')
permissions = Permission.query.all()
if request.method == 'GET':
return render_template('add_user_per.html',permissions = permissions)
if request.method == 'POST':
p_id = request.form['p_id']
     # 找出对应权限
     # 此处用get(id)获取, 不要使用filter_by
    # 对多关系中获取对象,只能用get(id)方法,不能通过filter或者filter_by来获取
permission = Permission.query.get(p_id)
     # 找出对应角色
role = Role.query.get(r_id)
     # 然后添加权限
role.permission.append(permission)
     # 保存数据库
db.session.commit()
return redirect(url_for('user.roles')) #多对多删除
# 权限管理/角色列表/减少权限
@user.route('/subuserper/', methods=['GET', 'POST'])
@is_login
def subuserper():
r_id = request.args.get('r_id')
roles = Role.query.get(r_id)
pers = roles.permission
if request.method == 'GET':
return render_template('user_per_list.html',pers=pers)
if request.method == 'POST':
p_id = request.form['p_id']
permission = Permission.query.get(p_id)
role = Role.query.get(r_id)
    # 和添加一样,只是此处用的是remove()
role.permission.remove(permission)
db.session.commit()
return redirect(url_for('user.roles'))
总结:ORM操作时,多对多关系的角色权限表(中间关联表),不需要用户维护.
												

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程序员考研失败后的面试经历,oppo、VIVO、等面经

      温馨提示:有些可能会遗漏个别问题,都是最近一周的面试,有点忘了. 浪潮(一面挂) 你是网络工程的?对网络很了解? 解释一下什么是广播域 怎么划分子网 说一下CSS的几种分类器 数据库中有哪些聚集函 ...

  2. SpringBoot一些基础配置

    定制banner Spring Boot项目在启动的时候会有一个默认的启动图案: . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( ...

  3. Nginx之负载均衡配置(二)

    前文我们聊到了nginx作为负载均衡的配置,前端nginx作为调度器调度http或https请求,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12458159 ...

  4. JetBrains 第二轮:再为免费全家桶续命三个月

    昨天分享了如何通过参与JetBrains的解密任务来获取正版全家桶的兑换码.今天 JetBrains 一早继续在Twitter推出第二波任务: 下面,我们就继续来一起参与一下,为我们的正版JetBra ...

  5. 关于.NET中的控制反转及AutoFac的简单说明

    目录 1.控制反转 1.1 什么是依赖? 1.2 什么是控制反转? 1.3 什么是依赖注入? 1.4 简单总结 2.控制反转容器 2.1 IOC容器说明 2.2 使用AutoFac的简介示例 3 使用 ...

  6. Spring MVC启动流程分析

    本文是Spring MVC系列博客的第一篇,后续会汇总成贴子. Spring MVC是Spring系列框架中使用频率最高的部分.不管是Spring Boot还是传统的Spring项目,只要是Web项目 ...

  7. 【简说Python WEB】Flask-Moment

    目录 [简说Python WEB]Flask-Moment 系统环境:Ubuntu 18.04.1 LTS Python使用的是虚拟环境:virutalenv Python的版本:Python 3.6 ...

  8. 使用vue-router+vuex进行导航守卫(转)

    前言:想要实现登录后才能进入主页等其他页面,不然都会跳转到登录页.但是Vuex有个不够完美的地方,一旦刷新页面就会没了,所以还要用到localStorage. 一.router.js: import ...

  9. 03-Vue数据请求

    1. vue-resource vue-resource jsonp请求 <body> <div id="app"> <!-- v-model 监听表 ...

  10. [vue ]滚动视图解决ElementUI NavMenu 导航菜单过长显示的问题

    记录一下工作 需求 导航菜单过长的时候会溢出,需要一个像 Tabs 标签页一样的滚动视图容器,可以左右滚动内部视图. 解决方法 由于时间问题,所以直接将 Tabs 源码抽取出来使用. 这里要做一些特殊 ...