class HomeBannerSerializers(serializers.HyperlinkedModelSerializer): image = 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) goods_info = serializers.SerializerMethodField() class Meta: model = HomeBanner fields = generate_fields(HomeBanner, add=['goods_info'], remove=['add_time']) def get_goods_info(self, instance): if instance.goods: return {"goods_name": instance.goods.name} return None
class GoodsTypeSimplifiedSerializer(serializers.HyperlinkedModelSerializer): icon = obj(allow_null=True, label='封面图', queryset=File.objects.all(), required=False, view_name='file-detail', serializer_class=FileSerializer) ladder_list = serializers.ListField(label='阶梯', child=LadderField(), allow_null=True, required=False) class Meta: model = GoodType fields = ["id", "market_price", "price", "is_sell", "ladder_list"] def validate(self, attrs): if attrs.get('ladder_list'): attrs['ladder'] = json.dumps(attrs['ladder_list'], use_decimal=True) attrs.pop('ladder_list') return attrs def to_representation(self, instance): ret = super().to_representation(instance) if instance.ladder: ret['ladder_list'] = json.loads(instance.ladder, use_decimal=True) else: ret['ladder_list'] = None return ret
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 ShortcutSerializers(serializers.HyperlinkedModelSerializer): image = 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) class Meta: model = Shortcut fields = generate_fields(Shortcut, remove=['add_time'])
class BannerSerializer(serializers.HyperlinkedModelSerializer): image = obj(allow_null=True, label='封面图', queryset=File.objects.all(), required=False, view_name='file-detail', serializer_class=FileSerializer) goods = obj(allow_null=True, label='商品', queryset=Goods.objects.all(), required=False, view_name='goods-detail', serializer_class=GoodsSerializer) class Meta: model = Banner fields = generate_fields(Banner, add=[])
class StoreLogoSerializers(serializers.Serializer): square_logo = obj(allow_null=True, label='正方形logo', queryset=File.objects.all(), required=False, view_name='file-detail', serializer_class=FileSerializer) rectangle_logo = obj(allow_null=True, label='长方形logo', queryset=File.objects.all(), required=False, view_name='file-detail', serializer_class=FileSerializer) def save(self, **kwargs): square_logo = self.validated_data.get('square_logo') rectangle_logo = self.validated_data.get('rectangle_logo') StoreLogo.objects.update_or_create(label='square_logo', defaults={'image': square_logo}) StoreLogo.objects.update_or_create(label='rectangle_logo', defaults={'image': rectangle_logo}) return { 'square_logo': FileSerializer(instance=square_logo, context=self.context).data, 'rectangle_logo': FileSerializer(instance=rectangle_logo, context=self.context).data, }
class ImagesSerializer(serializers.HyperlinkedModelSerializer): image = obj(allow_null=True, label='图片', queryset=File.objects.all(), required=False, view_name='file-detail', serializer_class=FileSerializer) class Meta: model = Images fields = generate_fields(Images, add=[])
class StorePosterSerializers(serializers.Serializer): store_poster = obj(allow_null=True, label='分享海报', queryset=File.objects.all(), required=False, view_name='file-detail', serializer_class=FileSerializer) def save(self, **kwargs): store_poster = self.validated_data.get('store_poster') StoreLogo.objects.update_or_create(label='store_poster', defaults={'image': store_poster}) return { 'store_poster': FileSerializer(instance=store_poster, context=self.context).data.get('file'), }
class ReplGoodsTypeSerializer(serializers.HyperlinkedModelSerializer): icon = obj(allow_null=True, label='封面图', queryset=File.objects.all(), required=False, view_name='file-detail', serializer_class=FileSerializer) class Meta: model = ReplGoodsType fields = generate_fields(ReplGoodsType, remove=[ 'original_limit', 'change_limit', ])
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