django中获取的数据默认是一个模型对象,而模型对象传到前端或者别的平台是没法直接使用的,所以需要把这个模型对象进行序列化,编程字符串或者json等格式传到前端去。
序列化和反序列化
序列化就是把django中的数据转换成前端能使用的json等格式,让前后端进行数据交互的时候不会出现差错。反序列化就是将前端传过来的数据,变成python django中能够使用的对象,还原成我们需要的格式。
Serializer序列化器
需要提前引入序列化器所相对应的库
1 | from rest_framework import serializer |
序列化器中有两种序列化组件Serializer和ModelSerializer;其中Serializer是自定义序列化,在类里面定义需要序列化的字段,然后通过该组件进行序列化和反序列化;ModelSerializer为开发者提供了一个捷径,它可以通过modles来快速创建序列化,对model进行绑定了之后它会自动创建一些字段,也就是model中所对应的字段,并且进行一些简单的验证,如unique_together(联合唯一验证:如果某两条数据完全相同,会被django拒绝创建)且包含简单的默认creat()方法和update()方法(他们会新增或更新数据的时候执行,而普通的Serializer的默认create()方法里面没有任何内容,执行时会提示报错,需要自己重写)
序列化器中的source
source可以修改返回到前端的字段名。(修改后的字段名 = serializer.Charfield(max_length=16,source=”修改前的字段名”))
如果models对应表下有所对应的方法test(),可以使用serilizers.CharField(max_length=16, source=’test’):这样在定义对应的字段的时候,会将test()方法返回的值赋予对应的字段。
source还可以进行跨表查询serializers.Charfield(source=”表名.字段名”)但要注意这种涉及外键的需要自己重写create()方法,不然执行的时候会出现各种小问题。
补充
serializers.SerializersMethodField()
在定义序列化器类型的时候,如果定义的类型是serializers.SerializersMethodField(),那么会执行序列化器下方的方法
1 | gender = serializers.SerializerMethodField() |
但是这样会导致一个问题,就是在反序列化的时候,并不会获取到gender这个参数,导致性别无法新增或修改。如果要让代码足够优雅的话,需要用source参数并重写update()和create()方法。
1 | gender = serializers.CharField(source='get_gender_display', required=False) |
to_representation
序列器类下的这个函数方法是修改返回值的,例如下列代码,我想要接口中每个为空的字段直接不返回,就可以通过如下代码实现:
1 | def to_representation(self, instance): |