You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
2.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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