From f63ae9c2475338069bfda469208cddc923511c65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E5=89=8D=E6=98=8E?= <909355014@qq.com> Date: Sat, 25 Jun 2022 12:03:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E8=AF=81=E4=B9=A6=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/opm/serializers.py | 47 ++++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/apps/opm/serializers.py b/apps/opm/serializers.py index 0b500513..73b5eaaa 100644 --- a/apps/opm/serializers.py +++ b/apps/opm/serializers.py @@ -57,14 +57,20 @@ class OplWorkerCreateSerializer(CustomModelSerializer): certificates = validated_data.pop('certificates') if OplWorker.objects.filter(worker=validated_data['worker'], opl=validated_data['opl']).exists(): raise ParseError('该成员已加入') - oplw = super().create(validated_data) - for x in certificates: - oplc, _ = OplCert.objects.get_or_create(opl_worker=oplw, certificate=x, - defaults={'opl_worker': oplw, 'certificate': x}) - for f in Certificate._meta.fields: - if f.name not in ['id']: - setattr(oplc, f.name, getattr(x, f.name, None)) - oplc.save() + with transaction.atomic(): + oplw = super().create(validated_data) + for x in certificates: + oplc = OplCert.objects.filter(opl_worker=oplw, certificate=x).first() + if oplc: + pass + else: + oplc = OplCert + oplc.opl_worker = oplw + oplc.certificate = x + for f in Certificate._meta.fields: + if f.name not in ['id']: + setattr(oplc, f.name, getattr(x, f.name, None)) + oplc.save() return oplw @@ -77,14 +83,20 @@ class OplWorkerUpdateSerializer(CustomModelSerializer): def update(self, instance, validated_data): certificates = validated_data.pop('certificates') - oplw = super().update(instance, validated_data) - for x in certificates: - oplc, _ = OplCert.objects.get_or_create(opl_worker=oplw, certificate=x, - defaults={'opl_worker': oplw, 'certificate': x}) - for f in Certificate._meta.fields: - if f.name not in ['id']: - setattr(oplc, f.name, getattr(x, f.name, None)) - oplc.save() + with transaction.atomic(): + oplw = super().update(instance, validated_data) + for x in certificates: + oplc = OplCert.objects.filter(opl_worker=oplw, certificate=x).first() + if oplc: + pass + else: + oplc = OplCert + oplc.opl_worker = oplw + oplc.certificate = x + for f in Certificate._meta.fields: + if f.name not in ['id']: + setattr(oplc, f.name, getattr(x, f.name, None)) + oplc.save() return oplw @@ -123,7 +135,7 @@ class OplCreateUpdateSerializer(CustomModelSerializer): 'power_end_time', 'power_start_time', 'power_days', 'other_risk', 'other_emr', 'escape_route', 'risks_checked', 'measures_checked', 'create_imgs'] - + def create(self, validated_data): operation = validated_data['operation'] if operation.state == Operation.OP_CLOSE: @@ -133,6 +145,7 @@ class OplCreateUpdateSerializer(CustomModelSerializer): class OplSerializer(CustomModelSerializer): cate_name = serializers.CharField(source='cate.name', read_only=True) + class Meta: model = Opl fields = '__all__'