forked from erp-dev/erp
89 lines
3.2 KiB
Python
89 lines
3.2 KiB
Python
"""
|
|
Shipment API 序列化器
|
|
"""
|
|
from rest_framework import serializers
|
|
|
|
from shipment.models import Shipment
|
|
|
|
|
|
class ShipmentSerializer(serializers.ModelSerializer):
|
|
"""
|
|
出货单序列化器(只读,用于返回数据)
|
|
"""
|
|
customer_name = serializers.CharField(source='customer.name', read_only=True)
|
|
created_by_id = serializers.IntegerField(source='created_by.id', read_only=True, allow_null=True)
|
|
created_by_name = serializers.SerializerMethodField()
|
|
items_count = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = Shipment
|
|
fields = [
|
|
'id', 'customer', 'customer_name', 'shipment_date', 'remark',
|
|
'items_count', 'created_by_id', 'created_by_name',
|
|
'created_at', 'updated_at'
|
|
]
|
|
read_only_fields = ['id', 'created_at', 'updated_at']
|
|
|
|
def get_created_by_name(self, obj):
|
|
if obj.created_by:
|
|
employee = getattr(obj.created_by, 'employee', None)
|
|
if employee:
|
|
return employee.name
|
|
return obj.created_by.username
|
|
return None
|
|
|
|
def get_items_count(self, obj):
|
|
return obj.items.count()
|
|
|
|
|
|
class ShipmentCreateSerializer(serializers.Serializer):
|
|
"""
|
|
出货单创建序列化器
|
|
"""
|
|
customer = serializers.IntegerField(help_text='客户ID')
|
|
shipment_date = serializers.DateField(help_text='出货日期')
|
|
remark = serializers.CharField(required=False, default='', allow_blank=True, help_text='备注')
|
|
sales_items = serializers.ListField(
|
|
child=serializers.IntegerField(),
|
|
required=False,
|
|
default=list,
|
|
help_text='要关联的销售品ID列表'
|
|
)
|
|
|
|
def validate_sales_items(self, value):
|
|
# 去重
|
|
return list(set(value)) if value else []
|
|
|
|
|
|
class SalesItemSerializer(serializers.Serializer):
|
|
"""
|
|
销售品序列化器(只读)
|
|
|
|
用于返回销售品数据
|
|
"""
|
|
id = serializers.IntegerField(read_only=True)
|
|
name = serializers.CharField(read_only=True)
|
|
quantity = serializers.DecimalField(max_digits=12, decimal_places=2, read_only=True)
|
|
unit = serializers.IntegerField(read_only=True)
|
|
unit_display = serializers.SerializerMethodField()
|
|
position = serializers.CharField(read_only=True)
|
|
remark = serializers.CharField(read_only=True)
|
|
printing_job_id = serializers.IntegerField(read_only=True)
|
|
customer_id = serializers.IntegerField(read_only=True)
|
|
shipment_id = serializers.IntegerField(source='shipment.id', read_only=True, allow_null=True)
|
|
shipment_date = serializers.DateField(source='shipment.shipment_date', read_only=True, allow_null=True)
|
|
created_at = serializers.DateTimeField(read_only=True)
|
|
created_by_id = serializers.IntegerField(source='created_by.id', read_only=True, allow_null=True)
|
|
created_by_name = serializers.SerializerMethodField()
|
|
|
|
def get_unit_display(self, obj):
|
|
return obj.get_unit_display()
|
|
|
|
def get_created_by_name(self, obj):
|
|
if obj.created_by:
|
|
employee = getattr(obj.created_by, 'employee', None)
|
|
if employee:
|
|
return employee.name
|
|
return obj.created_by.username
|
|
return None
|