From c1aff2509977452e667e0877c8fd829dd0f75755 Mon Sep 17 00:00:00 2001 From: hukai Date: Tue, 29 Oct 2024 11:50:07 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat;=20Python=20=E5=90=8E=E7=AB=AF=20?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=BB=91=E5=AE=9A=E8=A7=92=E8=89=B2=E7=AD=89?= =?UTF-8?q?=E3=80=82=20=20=E7=BB=91=E5=AE=9A=E9=9C=80=E6=B1=82=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E6=9A=B4=E5=8A=9B=E6=95=B0=E6=8D=AE=E5=BA=93=E8=A1=A8?= =?UTF-8?q?=E7=9A=84=E6=96=B0=E5=A2=9E=E5=92=8C=E5=88=9B=E5=BB=BA=E3=80=82?= =?UTF-8?q?=20=20=E4=BC=98=E5=8C=96=E6=95=B0=E6=8D=AE=E5=BA=93=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=92=8C=E4=BF=AE=E6=94=B9=E3=80=82=20=20=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E5=85=AC=E5=85=B1=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo.py" | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 "\350\265\204\346\272\220\347\273\221\345\256\232\344\274\230\345\214\226/demo.py" 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 0000000..9906b5c --- /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( + [models.OrgUnitMeterModel(user=instance, role_id=ite) for ite in create_ids] + ) \ No newline at end of file -- Gitee From d22e9251d5dae7dcefa3bc080cb19990260478f1 Mon Sep 17 00:00:00 2001 From: hukai Date: Tue, 29 Oct 2024 13:19:20 +0800 Subject: [PATCH 2/2] =?UTF-8?q?to;=20=E9=80=BB=E8=BE=91=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../demo.py" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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" index 9906b5c..2afcba5 100644 --- "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" @@ -33,7 +33,7 @@ def update_create(instance, data,): elif set2.issubset(set1): create_ids = set1 - set2 else: - union = set1 & set2 + union = set1 | set2 delete_ids = union - set2 create_ids = union - set1 @@ -44,5 +44,5 @@ def update_create(instance, data,): RoleUser.objects.filter(user_id__in=delete_ids).delete() if create_ids: RoleUser.objects.bulk_create( - [models.OrgUnitMeterModel(user=instance, role_id=ite) for ite in create_ids] + [RoleUser(user=instance, role_id=ite) for ite in create_ids] ) \ No newline at end of file -- Gitee