Django 之REST framework学习:序列化的几种方式

models:

class Goods(models.Model):
    """
    商品
    """
    category = models.ForeignKey(GoodsCategory, verbose_name="商品类目", on_delete=models.CASCADE)
    goods_sn = models.CharField(max_length=50, default="", verbose_name="商品唯一货号")
    name = models.CharField(max_length=100, verbose_name="商品名")
    click_num = models.IntegerField(default=0, verbose_name="点击数")
    sold_num = models.IntegerField(default=0, verbose_name="商品销售量")
    fav_num = models.IntegerField(default=0, verbose_name="收藏数")
    goods_num = models.IntegerField(default=0, verbose_name="库存数")
    market_price = models.FloatField(default=0, verbose_name="市场价格")
    shop_price = models.FloatField(default=0, verbose_name="本店价格")
    goods_brief = models.TextField(max_length=500, verbose_name="商品简短描述")
    # goods_desc = UEditorField(verbose_name=u"内容", imagePath="goods/images/", width=1000,
    # height=300,filePath="goods/files/", default='')
    ship_free = models.BooleanField(default=True, verbose_name="是否承担运费")
    goods_front_image = models.ImageField(upload_to="goods/images/", null=True, blank=True, verbose_name="封面图")
    is_new = models.BooleanField(default=False, verbose_name="是否新品")
    is_hot = models.BooleanField(default=False, verbose_name="是否热销")
    add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间")

    class Meta:
        verbose_name = '商品'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name
M1:

views

class GoodsSerializer(ModelSerializer):
    """"""
    class Meta:
        model = models.Goods
        fields = "__all__"
        #这个可以跨表操作,指查询的深度
        depth = 2


class GoodsView(APIView):
    def get(self, request, *args, **kwargs):
        goods_list = models.Goods.objects.all()
        """
        如果传递的是queryset,则GoodsSerializer需要many参数;
        如果传递的是单个类,则GoodsSerializer不需要many参数,默认为False;    
        """
        json_goods = GoodsSerializer(instance=goods_list, many=True)
        #注意`.data`
        return Response(json_goods.data)
M2:
serializer_field_mapping = {
        models.AutoField: IntegerField,
        models.BigIntegerField: IntegerField,
        models.BooleanField: BooleanField,
        models.CharField: CharField,
        models.CommaSeparatedIntegerField: CharField,
        models.DateField: DateField,
        models.DateTimeField: DateTimeField,
        models.DecimalField: DecimalField,
        models.EmailField: EmailField,
        models.Field: ModelField,
        models.FileField: FileField,
        models.FloatField: FloatField,
        models.ImageField: ImageField,
        models.IntegerField: IntegerField,
        models.NullBooleanField: NullBooleanField,
        models.PositiveIntegerField: IntegerField,
        models.PositiveSmallIntegerField: IntegerField,
        models.SlugField: SlugField,
        models.SmallIntegerField: IntegerField,
        models.TextField: CharField,
        models.TimeField: TimeField,
        models.URLField: URLField,
        models.GenericIPAddressField: IPAddressField,
        models.FilePathField: FilePathField,
}

views

class GoodsSerializer(Serializer):
    #如果要深度查询,需要使用source参数
    category = serializers.CharField(source="category.name")
    goods_sn = serializers.CharField()
    name = serializers.CharField()
    click_num = serializers.IntegerField()
    sold_num = serializers.IntegerField()
    fav_num = serializers.IntegerField()
    goods_num = serializers.IntegerField()
    market_price = serializers.FloatField()
    shop_price = serializers.FloatField()
    goods_brief = serializers.CharField()
    ship_free = serializers.BooleanField()
    goods_front_image = serializers.ImageField()
    is_new = serializers.BooleanField()
    is_hot = serializers.BooleanField()
    add_time = serializers.DateTimeField()


class GoodsView(APIView):
    def get(self, request, *args, **kwargs):
        # goods_list = models.Goods.objects.all()

        goods_list = models.Goods.objects.first()

        json_goods = GoodsSerializer(instance=goods_list, )
        return Response(json_goods.data)
M3:

views

class MyCharField(serializers.CharField):
    #重写to_representation,实现自定制!
    def to_representation(self, value):
        data_list = []
        for data in data_list:
            data_list.append(data.name)
        return data_list


class GoodsSerializer(Serializer):
    category = MyCharField(source="supplier.all")
    goods_sn = serializers.CharField()
    name = serializers.CharField()
class MyCharField(serializers.CharField):
    def to_representation(self, value):
        return {'pk': value.pk, 'name': value.name}


class GoodsSerializer(Serializer):
    #这句话的意思是对每个罗列的条目进行自定制化显示
    category = serializers.ListField(child=MyCharField(), source="supplier.all")
    goods_sn = serializers.CharField()
    name = serializers.CharField()

推荐使用:

class GoodsSerializer(Serializer):
    # category = serializers.ListField(child=MyCharField(), source="supplier.all")
    #使用SerializerMethodField可以挂载函数,这样实现高度化定制
    category = serializers.SerializerMethodField()
    """必须以get_开头"""
    def get_category(self):
        cata_list = models.Goods.objects.all()
        data_list = []
        for cata in cata_list:
            #返回字典形式
            data_list.append({"cata":cata.name})
        return data_list

补充数据校验:

class GoodsValidator(object):
    def __init__(self, base):
        self.base = base

    def __call__(self, value):
        if value != self.base:
            raise serializers.ValidationError(value)

class GoodsSerializer(serializers.Serializer):
    #直接在字段内校验数据
    name = serializers.CharField(min_length=8)
    price = serializers.CharField(error_messages={'required': '必填'}, validators=[GoodsValidator('hello')])

class GoodsValidator(object):
    def __init__(self, base):
        self.base = base

    def __call__(self, value):
        if value != self.base:
            raise serializers.ValidationError(value)

class GoodsSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Goods
        fields = "__all__"
        #这样也能校验数据
        extra_kwargs = {
            'name': {'min_length': 6},
            'price': {'validators': [GoodsValidator('hello'), ]}
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值