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操作時,多對多關系的角色權限表(中間關聯表),不需要用戶維護.



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM