zoukankan      html  css  js  c++  java
  • flask中 多对多的关系 主从表之间的的增删改查

    # 角色表模型
    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操作时,多对多关系的角色权限表(中间关联表),不需要用户维护.


  • 相关阅读:
    linux中公钥和私钥的区别以及关系
    PAM
    57 容器(十一)——Collections容器工具类
    56 容器(十)——Iterator迭代器遍历容器
    55 重载需要注意的地方
    54 容器(九)——HashSet
    53 容器(八)——TreeMap 红黑树
    52 权限修饰符
    51 方法重写需要注意的地方
    50 多态,为什么总是要用父类引用指向子类对象?
  • 原文地址:https://www.cnblogs.com/Jokerguigui/p/11576670.html
Copyright © 2011-2022 走看看