diff --git "a/\350\265\204\346\272\220\347\273\221\345\256\232\344\274\230\345\214\226/demo.py" "b/\350\265\204\346\272\220\347\273\221\345\256\232\344\274\230\345\214\226/demo.py" new file mode 100644 index 0000000000000000000000000000000000000000..2afcba5556d9d44b90c7c23679e84edee4613f6d --- /dev/null +++ "b/\350\265\204\346\272\220\347\273\221\345\256\232\344\274\230\345\214\226/demo.py" @@ -0,0 +1,48 @@ +from django.db import models +from django.db.transaction import atomic + +class User(models.Model): + name = models.CharField(max_length=10) + + +class Role(models.Model): + name = models.CharField(max_length=10) + + +class RoleUser(models.Model): + user = models.ForeignKey(User, on_delete=models.SET_NULL) + role = models.ForeignKey(Role, on_delete=models.SET_NULL) + + + +def update_create(instance, data,): + """ + a 绑定 b。 + 常见方法 a和b中间表 删除旧绑定数据,新增新绑定数据。 + 升级方法 通过 集合特性比对,优化 旧数据时新数据的子集或新数据是旧数据子集时,重复删除和创建问题。 + 放弃 暴力 删除所有。比对 + :param instance 对象 + :param data 前端传递数据 + """ + set1 = set(data) + set2 = set(RoleUser.objects.filter(user=instance).values_list('role_id', flat=True)) + delete_ids, create_ids = None, None + if set1.issubset(set2): + delete_ids = set2 - set1 + + elif set2.issubset(set1): + create_ids = set1 - set2 + else: + union = set1 | set2 + delete_ids = union - set2 + create_ids = union - set1 + + if delete_ids or create_ids: + # 开启事务 + with atomic(): + if delete_ids: + RoleUser.objects.filter(user_id__in=delete_ids).delete() + if create_ids: + RoleUser.objects.bulk_create( + [RoleUser(user=instance, role_id=ite) for ite in create_ids] + ) \ No newline at end of file