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)