from django.db import transaction from django.db.models import Sum from rest_framework import serializers from rest_framework.exceptions import ValidationError from financial_info.models import PaymentItemModel, PaymentModel class PaymentItemSerializer(serializers.ModelSerializer): """ 付款单中 付款项目 的序列化器 """ # 查询当前采购入库单中已经支付金额 already_payment = serializers.SerializerMethodField(read_only=True, help_text='已经付款的金额') class Meta: model = PaymentItemModel fields = '__all__' def get_already_payment(self, obj): """ 查询当前采购入库单中已经支付金额 :param obj: PaymentItemModel :return: 0获取其他的数值 """ if obj.purchase_storage: pay_dict = PaymentItemModel.objects.filter(purchase_storage_id=obj.purchase_storage.id)\ .exclude(payment__status='0')\ .aggregate(sum=Sum('this_money')) if pay_dict: return pay_dict['sum'] if pay_dict['sum'] else 0 return 0 return 0 class PaymentSerializer(serializers.ModelSerializer): """ 付款单——序列化器 """ item_list = PaymentItemSerializer(many=True, required=False) class Meta: model = PaymentModel fields = '__all__' def create(self, validated_data): if 'item_list' not in validated_data: return super(PaymentSerializer, self).create(validated_data) item_list = validated_data.pop('item_list') with transaction.atomic(): payment = PaymentModel.objects.create(**validated_data) for item in item_list: # 插入付款项目 PaymentItemModel.objects.create(payment=payment, **item) return payment # 必须重写update def update(self, instance, validated_data): if instance.status != '0': raise ValidationError("付款单已经生效,不能修改!") with transaction.atomic(): if 'item_list' in validated_data: item_list = validated_data.pop('item_list') old_list = instance.item_list.all() if old_list.exists(): # 然后把旧数据删除,因为在validated_data拿不到货品库存数据的ID instance.item_list.all().delete() for item in item_list: # 重新插入采购项 数据 PaymentItemModel.objects.create(payment=instance, **item) result = super(PaymentSerializer, self).update(instance=instance, validated_data=validated_data) return result