如何在Django模型中将指定用户从其所属的所有用户组中移除
你可以直接使用Django多对多关系管理器自带的批量操作方法,全程只需要执行1次SQL,完全不需要遍历关联对象,效率很高。
方案1:直接调用反向关系的clear()方法(最简洁)
对于你定义的反向关系member_in_groups,直接执行以下代码即可清空user1和所有关联组的绑定关系:
user1.member_in_groups.clear()
Django会直接在多对多中间表中删除所有关联该用户的记录,不需要先查询出所有关联的Group实例,也不需要循环执行移除操作。
方案2:直接操作中间表批量删除(适合需要额外过滤条件的场景)
如果后续你需要只移除用户符合特定条件的组(而非全部),可以直接操作多对多字段的中间表执行批量删除,性能和第一种方案一致:
# 获取多对多字段对应的中间表模型 GroupMemberMiddleModel = Group.members.through # 批量删除中间表中该用户的所有关联记录 GroupMemberMiddleModel.objects.filter(organizationuser_id=user1.id).delete()
如果需要加过滤条件,只需要在filter()方法里追加对应的规则即可,比如只移除名称包含「临时」的组的关联:
GroupMemberMiddleModel.objects.filter( organizationuser_id=user1.id, group__name__contains="临时" ).delete()
注意:两种方案都远优于遍历关联组逐个移除的实现,遍历方案会先执行1次查询获取所有关联组,再对每个组执行1次删除操作,数据量大时会产生严重的性能问题。
内容的提问来源于stack exchange,提问作者Tanvir Ahmed
相关产品推荐
相关产品推荐

