Django rest framework serializer基本用法

serializer的作用

以下仅为个人看法。最后面我会附上序列化器参数图。
1.规定前端传入的参数
2.规定参数的类型
3.将参数序列化 我的理解也就是转变成字典
4.规定后端返回数据字段
5.规定后端返回数据字段类型
6.检查参数
7.序列化数据

规定参数

class CheckedParamSerializer(serializers.Serializer):
    ad_id = serializers.IntegerField(required=True)
    is_pass = serializers.BooleanField(required=True)
    reject_desc = serializers.CharField(max_length=64, default='', allow_blank=True)
    location = serializers.ListField(required=False)
    credit_ratio = serializers.DecimalField(max_digits=9, decimal_places=2, required=False)
	
	def create(self):
		pass
	
	def update(self):
		pass

这是我项目中用到的一段序列化器。
这些类型应该不用解释。只要是学过编程的都能看懂。解释下类型里面的参数
1.required 是否比传 如果值为Flase 那么前端可以不用传这个参数如果是True那么前端就必须传入
2.max_length 是限制字符的最大长度。
3. default 这个应该很好理解这个就是默认值
4. allow_blank 这个也是只有char类型有的参数当该字段不是比传参数时可以为空 如果allow_blank的值为False就代表不能为空
5. max_digits 这是浮点型里面的参数,为最多位数,上面的例子就说明credit_ratio 最多9位数字
6. decimal_places 小数点位置 比如 1.02
使用serializer.Serializer需要重写create和update方法因为这是个serializer中的抽象方法。你也可以单独封装一个serializer然后向上面例子一样只是重写两个方法,然后其他的序列化器继承这个封装的序列化器从而达到没有警告的问题。

规定返回数据

class ReturnDataSerializer(serializers.Serializer):
    ad_id = serializers.IntegerField(read_only=True)
    ad_name = serializers.CharField(max_length=20, read_only=True)
    ad_type = serializers.IntegerField(read_only=True)

read_only 光看单词意思也明白了 ,read_only=True 我的理解是必须返回此字段。如果为False可以不返回。
read_only:True表示不允许用户自己上传,只能用于api的输出。如果某个字段设置了read_only=True,那么就不需要进行数据验证,只会在返回时,将这个字段序列化后返回
举个简单的例子:在用户进行购物的时候,用户post订单时,肯定会产生一个订单号,而这个订单号应该由后台逻辑完成,而不应该由用户post过来,如果不设置read_only=True,那么验证的时候就会报错。
write_only: 与read_only对应
required: 顾名思义,就是这个字段是否必填。
allow_null/allow_blank:是否允许为NULL/空 。

使用Model来规定序列化器的数据

class ModelsRuleSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserDetail
        fields = ("name", "gender", "birthday", "email", "mobile")
        # fields = '__all__': 表示所有字段
        # exclude = ('add_time',):  除去指定的某些字段
        # 这三种方式,存在一个即可

ModelSerializer已经重载了create与update方法,它能够满足将post或patch上来的数据进行进行直接地创建与更新,除非有额外需求,那么就可以重载create与update方法。
  ModelSerializer在Meta中设置fields字段,系统会自动进行映射,省去每个字段再写一个field。

ModelSerializer需要解决的2个问题:

1,某个字段不属于指定model,它是write_only,需要用户传进来,但我们不能对它进行save( ),因为ModelSerializer是基于Model,这个字段在Model中没有对应,这个时候,我们需要重载validate!
如在用户注册时,我们需要填写验证码,这个验证码只需要验证,不需要保存到用户这个Model中:

def validate(self, attrs):
    del attrs["code"]
    return attrs

2,某个字段不属于指定model,它是read_only,只需要将它序列化传递给用户,但是在这个model中,没有这个字段!我们需要用到SerializerMethodField。
  假设需要返回用户加入这个网站多久了,不可能维持这样加入的天数这样一个数据,一般会记录用户加入的时间点,然后当用户获取这个数据,我们再计算返回给它。

class UserSerializer(serializers.ModelSerializer):  
    days_since_joined = serializers.SerializerMethodField()
    # 方法写法:get_ + 字段
    def get_days_since_joined(self, obj):
    # obj指这个model的对象
        return (now() - obj.date_joined).days

    class Meta:
        model = User

当然,这个的SerializerMethodField用法还相对简单一点,后面还会有比较复杂的情况。

many参数

如果关联的对象数据不是只有一个,而是包含多个数据,如想序列化图书BookInfo数据,每个BookInfo对象关联的英雄HeroInfo对象可能有多个,此时关联字段类型的指明仍可使用上述几种方式,只是在声明关联字段时,多补充一个many=True参数即可。
假如说我们有个BookInfo的序列化器

class BookInfoSerializer(serializers.Serializer):
    btitle = serializers.CharField(min_length=3,max_length=20)
    bpub_date = serializers.DateField()
    bread = serializers.IntegerField(read_only=True)
    # 此字段将被序列化为关联对象的主键。
    heroinfo_set = serializers.PrimaryKeyRelatedField(many=True,read_only=True)
    # 此字段将被序列化为关联对象的字符串表示方式(即__str__方法的返回值)
    heroinfo_set = serializers.StringRelatedField(read_only=True,many=True)
    # 使用关联对象的序列化器
    heroinfo_set = HeroInfoSerializer(many=True)
from bookapp.serializers import BookInfoSerializer
from bookapp.models import BookInfo

book = BookInfo.objects.get(id=2)
serializer = BookInfoSerializer(book)
serializer.data
{'btitle': '天龙八部', 'bread': 36, 'bpub_date': '1986-07-24', 'heroinfo_set': [OrderedDict([('hname', '乔峰'), ('hcomment', '降龙十八掌')]), OrderedDict([('hname', '段誉'), ('hcomment', '六脉神剑')]), OrderedDict([('hname', '虚竹'), ('hcomment', '天山[('hname', '王语嫣'), ('hcomment', '神仙姐姐')])]}

序列化器参数图:
Django rest framework serializer基本用法_第1张图片

其他技巧请看:
1.https://blog.csdn.net/l_vip/article/details/79156113?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

2.https://www.jianshu.com/p/26529651aa27

你可能感兴趣的:(python)