Django REST_framework 序列化与反序列化使用


model

class Goods(BaseModels):
    """
    商品
    """
    category = models.ForeignKey(GoodsCategory, verbose_name="商品类目", on_delete=models.SET_NULL, null=True, blank=True)
    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 = models.TextField(verbose_name="内容", 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="是否热销")

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

    def __str__(self):
        return self.name

 

Serializer

from rest_framework import serializers
from . import models


class CategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = models.GoodsCategory
        fields = '__all__'


class GoodsSerializer(serializers.Serializer):
    name5 = serializers.CharField(source='name')  # source指定字段名, 但该字段名不能与name5重名
    goods_sn = serializers.CharField()  # 参数write_only序列化的时候, 该字段不显示   参数read_only反序列化的时候该字段不传
    category = serializers.CharField(source='category.name')  # 外键返回一个category对象, 可以使用source指定对象中的属性  category.name
    type = serializers.CharField(source='category.get_category_type_display')  # 通过get_'字段名'_display获取choice的值
    func = serializers.SerializerMethodField()  # 通过SerializerMethodField方法返回一个钩子函数的返回值
    types = serializers.SerializerMethodField()  # 通过自定义字典的元素返回数据
    typeall = serializers.SerializerMethodField()  # 通过序列化类返回数据

    def get_func(self, obj):  # 必须使用get_'字段名'作为方法名, 必须传入一个参数, obj 为Goods对象
        return obj.name

    def get_types(self, obj):
        return {'name':obj.category.name, 'desc': obj.category.desc}

    def get_typeall(self, obj):
        res = CategorySerializer(obj.category)
        return res.data

 

ModelSerializer

from rest_framework import serializers
from . import models

class GoodsSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Goods
        # fields = '__all__'  # 全部字段
        # fields = ['name', 'shop_price']  # 列表中的字段
        exclude = ['name', 'shop_price']  # 排除列表中的字段, 不能与fields一起使用
        depth = 1  # 深度为1, 最多推荐3

    # 同Serializer方法使用更改字段

 

 

反序列化

serializer

from rest_framework import serializers
from . import models



class GoodsSerializer(serializers.Serializer):
    name5 = serializers.CharField(source='name')  # source指定字段名, 但该字段名不能与name5重名

    def create(self, validated_data):  # 必须重写create 方法, 不然会断言
        ret = models.Goods.objects.create(**validated_data)  # 将传过来的数据保存数据库
        return ret

 

views   post

    def post(self, request):
        back_dic = {'code': 100, 'msg': '', 'data': None}
        goodser = serialize.GoodsSerializer(data=request.data)  # 将传过来的数据反序列化
        if goodser.is_valid():  # 通过is_valid为True, 并且将数据添加进validated_data
            ret = goodser.create(goodser.validated_data)  # 重写create方法
            back_dic['msg'] = '添加成功'
            back_dic['data'] = ret.name
        return Response(back_dic)

 

全局钩子与局部钩子校验数据

from rest_framework import serializers
from . import models
from rest_framework.exceptions import ValidationError


class GoodsSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Goods
        # fields = '__all__'  # 全部字段
        fields = ['name', 'shop_price']  # 列表中的字段
        # exclude = ['name', 'shop_price']  # 排除列表中的字段, 不能与fields一起使用
        depth = 1  # 深度为1, 最多推荐3

    # 同Serializer方法使用更改字段

    def validate_name(self, value):
        if value == '123':
            print(value)  # value为该字段的值
            raise ValidationError('不能为123')  # 将异常添加入errors中  可以通过goodser.errors获取
        return value

    def validate(self, attrs):
        if attrs.get('name') == attrs.get('shop_price'):  # attrs 为校验的数据, 为一个字典
            raise ValidationError('123')
        return attrs

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM