class GoodsListNewSerializer(serializers.HyperlinkedModelSerializer): ord_goods = ObjectHyperlinkedRelatedField( allow_empty=False, required=False, allow_null=True, label='普通商品', queryset=OrdGoods.objects.all(), view_name='ordgoods-detail', serializer_class=OrdGoodsSimplifiedSerializer, is_save=True) repl_goods = ObjectHyperlinkedRelatedField( allow_empty=False, required=False, allow_null=True, label='积分商品', queryset=ReplGoods.objects.all(), view_name='replgoods-detail', serializer_class=ReplGoodsSerializer, is_save=True) groupbuy_info = ObjectHyperlinkedRelatedField( allow_empty=False, required=False, allow_null=True, label='拼团信息', queryset=GroupBuyInfo.objects.all(), view_name='groupbuyinfo-detail', serializer_class=GroupBuyInfoSeriazlizers, is_save=True) category = obj(allow_null=True, label='商品分类', queryset=GoodsCategory.objects.all(), required=False, view_name='goodscategory-detail', serializer_class=GoodsCategorySimplifiedSerializer) banner = serializers.SerializerMethodField() def get_banner(self, instance): banner = instance.banner.first() if banner: return [ ImagesSerializer(instance=banner, context=self.context).data ] return None class Meta: model = Goods fields = generate_fields(Goods, add=[], remove=[ 'image', 'video', 'poster', 'is_template', 'delivery_method', 'shop', 'attach', 'detail' ]) def to_representation(self, instance): res = super().to_representation(instance) res['status'] = Goods.status_dict.get(res['status']) return res
class OrdGoodsSerializer(serializers.HyperlinkedModelSerializer): gtypes = ObjectHyperlinkedRelatedField( allow_empty=False, required=False, label='商品规格', many=True, queryset=GoodType.objects.all(), view_name='goodtype-detail', serializer_class=GoodsTypeSerializer, is_save=True) class Meta: model = OrdGoods fields = generate_fields(OrdGoods, add=[ 'estimate_time', 'price_range', 'market_price_range', 'max_rebate' ]) extra_kwargs = { 'price_range': { 'read_only': True }, 'market_price_range': { 'read_only': True }, 'max_rebate': { 'read_only': True }, }
class OrdGoodsSimplifiedSerializer(serializers.HyperlinkedModelSerializer): gtypes = ObjectHyperlinkedRelatedField( allow_empty=False, required=False, label='商品规格', many=True, queryset=GoodType.objects.all(), view_name='goodtype-detail', serializer_class=GoodsTypeSimplifiedSerializer, is_save=True) class Meta: model = OrdGoods fields = ["id", "gtypes"]
class ReplGoodsSerializer(serializers.HyperlinkedModelSerializer): gtypes = ObjectHyperlinkedRelatedField( allow_empty=False, required=False, label='积分商品规格', many=True, queryset=ReplGoodsType.objects.all(), view_name='replgoodstype-detail', serializer_class=ReplGoodsTypeSerializer, is_save=True) class Meta: model = ReplGoods fields = generate_fields(ReplGoods, add=['price_range']) extra_kwargs = { 'price_range': { 'read_only': True }, }
class GoodsSerializer(serializers.HyperlinkedModelSerializer): banner = ObjectHyperlinkedRelatedField(allow_empty=False, label='详情页轮播图', required=False, allow_null=True, many=True, queryset=Images.objects.all(), view_name='images-detail', serializer_class=ImagesSerializer, is_save=True) detail = ObjectHyperlinkedRelatedField(allow_empty=False, label='商品详情图', many=True, allow_null=True, required=False, queryset=Images.objects.all(), view_name='images-detail', serializer_class=ImagesSerializer, is_save=True) ord_goods = ObjectHyperlinkedRelatedField( allow_empty=False, required=False, allow_null=True, label='普通商品', queryset=OrdGoods.objects.all(), view_name='ordgoods-detail', serializer_class=OrdGoodsSerializer, is_save=True) repl_goods = ObjectHyperlinkedRelatedField( allow_empty=False, required=False, allow_null=True, label='积分商品', queryset=ReplGoods.objects.all(), view_name='replgoods-detail', serializer_class=ReplGoodsSerializer, is_save=True) groupbuy_info = ObjectHyperlinkedRelatedField( allow_empty=False, required=False, allow_null=True, label='拼团信息', queryset=GroupBuyInfo.objects.all(), view_name='groupbuyinfo-detail', serializer_class=GroupBuyInfoSeriazlizers, is_save=True) image = obj(allow_null=True, label='封面图', queryset=File.objects.all(), required=False, view_name='file-detail', serializer_class=FileSerializer) video = obj(allow_null=True, label='视频介绍', queryset=File.objects.all(), required=False, view_name='file-detail', serializer_class=FileSerializer) poster = obj(allow_null=True, label='海报图', queryset=File.objects.all(), required=False, view_name='file-detail', serializer_class=FileSerializer) category = obj(allow_null=True, label='商品分类', queryset=GoodsCategory.objects.all(), required=False, view_name='goodscategory-detail', serializer_class=GoodsCategorySerializer) shop = obj(allow_null=True, label='所属商店', queryset=Shop.objects.all(), required=False, view_name='shop-detail', serializer_class=ShopSerializer) create_poster = serializers.SerializerMethodField() attach = ObjectHyperlinkedRelatedField(label='自定义信息', many=True, allow_null=True, required=False, queryset=Attach.objects.all(), view_name='attach-detail', serializer_class=AttachSerializer, is_save=True) status = serializers.ChoiceField(label='商品状态', required=True, allow_null=False, choices=(('is_sell', '在售'), ('preview', '预览'), ('not_enough', '库存不足'), ('not_sell', '下架'))) delivery_method = serializers.ListField(allow_empty=True, child=serializers.ChoiceField( choices=Goods.METHOD, label='Delivery method'), label='配送方式', required=False) class Meta: model = Goods fields = generate_fields(Goods, add=['create_poster']) def validate(self, attrs): if attrs.get('groupbuy') and not attrs.get('groupbuy_info'): raise serializers.ValidationError('请为拼团商品设置拼团信息') if not attrs.get('fictitious', False) and not attrs.get('delivery_method'): raise serializers.ValidationError('请选择配送方式') return attrs def validate_delivery_method(self, value): if 'own' in value and 'express' in value: raise serializers.ValidationError('配送方式不能同时设置快递和自配送') return value def validate_status(self, value): status = None for k, v in Goods.status_dict.items(): if v == value: status = k break if status == None: raise serializers.ValidationError('商品状态错误') return status def get_create_poster(self, instance): return reverse('goods-poster', (instance.id, ), request=self.context.get('request')) def to_representation(self, instance): res = super().to_representation(instance) res['status'] = Goods.status_dict.get(res['status']) return res