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 ReceiptModel, ReceiptItemModel class ReceiptItemSerializer(serializers.ModelSerializer): """ 收款单中 收款项目 的序列化器 """ # 查询当前销售 出库单中已经 收金额 already_receipt = serializers.SerializerMethodField(read_only=True, help_text='已经收款的金额') class Meta: model = ReceiptItemModel fields = '__all__' def get_already_receipt(self, obj: ReceiptItemModel): """ 查询当前 销售出库单中已经 收的货款金额 :param obj: ReceiptItemModel :return: 0获取其他的数值 """ if obj.deliver_storage: sum_dict = ReceiptItemModel.objects.filter(deliver_storage_id=obj.deliver_storage.id)\ .exclude(receipt__status='0')\ .aggregate(sum=Sum('this_money')) if sum_dict: return sum_dict['sum'] if sum_dict['sum'] else 0 return 0 return 0 class ReceiptSerializer(serializers.ModelSerializer): """ 收款单——序列化器 """ item_list = ReceiptItemSerializer(many=True, required=False) class Meta: model = ReceiptModel fields = '__all__' def create(self, validated_data): if 'item_list' not in validated_data: return super(ReceiptSerializer, self).create(validated_data) item_list = validated_data.pop('item_list') with transaction.atomic(): receipt = ReceiptModel.objects.create(**validated_data) for item in item_list: # 插入收款项目 ReceiptItemModel.objects.create(receipt=receipt, **item) return receipt # 必须重写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: # 重新插入采购项 数据 ReceiptItemModel.objects.create(receipt=instance, **item) result = super(ReceiptSerializer, self).update(instance=instance, validated_data=validated_data) return result