• django自定义主键修改多对多的数据



    1、models

    # 角色表
    class Role(models.Model):
    """
    name: 角色名
    permissions: 角色拥有的权限
    """
    name = models.CharField(max_length=32)
    permissions = models.ManyToManyField(to='Permission')

    def __str__(self):
    return self.name


    # 用户表
    class UserInfo(models.Model):
    """
    用户信息表
    """
    roles = models.ManyToManyField(Role)

    class Meta:
    abstract = True # 执行数据库迁移指令时,不会生成表

    # User表继承扩展字段
    class User(UserInfo, BaseModel):
    userName = models.CharField(primary_key=True, max_length=20, null=False)
    password = models.CharField(max_length=20, null=False)
    name = models.CharField(max_length=20, default=None)
    remark = models.CharField(max_length=200, default=None)

    def __str__(self):
    return self.userName

    2、修改自定义主键时,同步更新m2m字段的数据

    # 获取用户的所有权限
    role_id = User.objects.filter(userName=before_user_name).values('roles')
    role_id_list = []
    # 生成角色ID列表
    for i in role_id:
    role_id_list.append(i['roles'])
    # 删除原来用户角色的关联关系
    role_obj = Role.objects.get(id=i['roles'])
    user = User.objects.get(userName=before_user_name)
    user.roles.remove(role_obj)

    # 先将外键限制去除
    cursorSql("SET FOREIGN_KEY_CHECKS = 0;")
    # 更新user的数据
    User.objects.filter(userName=before_user_name).update(userName=userName, password=password, name=name,
    remark=remark)
    # 插入数据后再恢复外键限制
    cursorSql("SET FOREIGN_KEY_CHECKS = 1;")

    # 将原来的角色id再赋给新用户名
    user_obj = User.objects.filter(userName=userName).first()
    user_obj.roles.set(role_id_list)
  • 相关阅读:
    python第四章:列表
    python第三章:函数
    python第二章:控制流
    python第一章:基础
    Spring Boot 集成 Mybatis(druid 数据库连接池 以及 分页配置)
    Spring Boot与Logback的运用(自定义异常+AOP)
    Spring Boot 简单的请求示例(包括请求体验证)
    Spring Boot之初始化项目
    深入理解javascript系列,读书笔记
    事件冒泡机制和事件委派 以及回调的匿名函数参数
  • 原文地址:https://www.cnblogs.com/wlj-axia/p/13812560.html
Copyright © 2020-2023  润新知