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.

88 lines
3.3 KiB

from django.db import transaction
from rest_framework import serializers
from ERP_5.utils.get_inventory import get_inventory_by_goods
from goods_info.models import GoodsModel, GoodsInventoryModel, AttachmentModel
from goods_info.serializer.attachment_serializer import AttachmentsSerializer
from goods_info.serializer.category_serializer import CategorySerializer
from goods_info.serializer.units_serializer import UnitsSerializer
class GoodsInventorySerializer(serializers.ModelSerializer):
"""
货品库存信息的序列化器
"""
class Meta:
model = GoodsInventoryModel
fields = '__all__'
class GoodsBaseSerializer(serializers.ModelSerializer):
"""
商品货品的序列化器
"""
# 商品对应的多个库存记录
inventory_list = GoodsInventorySerializer(many=True, required=True)
class Meta:
model = GoodsModel
fields = '__all__'
def create(self, validated_data):
# 添加货品, 把库存信息先拿出来
inventory_list = validated_data.pop('inventory_list')
with transaction.atomic():
goods = GoodsModel.objects.create(**validated_data)
for item in inventory_list: # item是字典
# item代表一条库存信息, # 新建时,当前库存=初始库存
item['cur_inventory'] = item.get('init_inventory', 0)
GoodsInventoryModel.objects.create(goods=goods, **item)
return goods
def update(self, instance, validated_data):
item_list = validated_data.pop('inventory_list')
for item in item_list: # 遍历每条库存信息,并修改最高库存和最低库存
GoodsInventoryModel.objects.filter(warehouse_name=item['warehouse_name'], goods_id=instance.id).update(
lowest_inventory=item.get('lowest_inventory', 0), highest_inventory=item.get('highest_inventory', 0))
goods = super(GoodsBaseSerializer, self).update(instance=instance, validated_data=validated_data)
return goods
class GoodsGetSerializer(serializers.ModelSerializer):
"""
商品查询的序列化器
目标:
1、把商品的单位——所有信息展示出来
2、展示商品信息所属的商品类别——所有信息展示出来
3、展示商品的所有附件图片——所有图片信息展示出来
4、展示商品的所有仓库中的库存信息——总库存
"""
units = UnitsSerializer(read_only=True)
category = CategorySerializer(read_only=True)
images_list = serializers.SerializerMethodField(read_only=True)
# 当前货品的总库存
cur_inventory = serializers.SerializerMethodField(read_only=True)
class Meta:
model = GoodsModel
fields = '__all__'
def get_images_list(self, obj):
result = [] # 返回的列表, 列表里面是字典(每个字典就是一个附件)
if obj.images_list:
ids = obj.images_list.split(',') # 按照逗号分割
if ids:
for _id in ids:
item = AttachmentModel.objects.get(id=_id)
ser = AttachmentsSerializer(instance=item)
result.append(ser.data)
return result
def get_cur_inventory(self, obj):
# 获取一个商品的总库存
return get_inventory_by_goods(obj.id)