REST framework 序列化组件Serializer与ModelSerializer区别

序列化:

  • Serializer
- 1. 序列化的字段数量可随意,单要与表中字段名对应
- 2. 自定义序列化属性:
gender = serializers.SerializerMethodField()
def get_gender(self, obj): # obj是对应表中的一条记录(即:对象)
# choice类型的解释型值 get_字段_display() 来访问
return obj.get_sex_display()
​
icon = serializers.SerializerMethodField()
def get_icon(self, obj):
# settings.MEDIA_URL: 自己配置的 /media/,给后面高级序列化与视图类准备的
# obj.icon不能直接作为数据返回,因为内容虽然是字符串,但是类型是ImageFieldFile类型
return '%s%s%s' % (r'http://127.0.0.1:8000', settings.MEDIA_URL, str(obj.icon))
  • ModelSerializer
- 1. class Meta类中关联序列化表,字段采用插拔式在fields中注册
- 2. 自定义序列化字段:
该方式设置的序列化字段,必须在fields中声明
publish_address = SerializerMethodField()
def get_publish_addr(self, obj):
return obj.publish.address

model类中自定义序列化字段
@property
def publish_name(self):
return self.publish.name # 利用跨表查询返回publish的name
@property
def author_list(self):
return self.authors.values('name', 'detail__mobile')

反序列化:

  • Serializer
- 1. 可使用局部钩子和全局钩子
- 2. 
类似froms组件的单字段校验规则,不满足时采用局部钩子
name = serializers.CharField(
  max_length=64,
  min_length=3,
  error_messages={
    'max_length': '太长',
    'min_length': '太短'
  }
  )
create,update 自定义, 序列化对象.save()时会调用
  • ModelSerializer:
- 1. 可使用局部钩子和全局钩子
- 2. 
extra_kwargs 用来完成反序列化字段的 系统校验规则
  extra_kwargs = {
    'name': {
    'required': True,
    'min_length':1,
    'error_messages': {'required':'必填项', 'min_length': '太短',}
  }
  }
ModelSerializer类已经帮我们实现了 create 与 update 方法,序列化对象.save()时会调用,也可以在序列化类中自定义

补充:

视图类传递参数给序列化类

在视图类中实例化序列化对象时,可以设置context内容

在序列化类中的局部钩子、全局钩子、create、update方法中,都可以用self.context访问视图类传递过来的内容

案例:

 在视图类中,可以通过request得到登陆用户request.user

在序列化类中,要完成数据库数据的校验与入库操作,可能会需要知道当前的登陆用户,但序列化类无法访问request

在视图类中实例化序列化对象时,将request对象传递进去

  • views.py
class Book(APIView):
    def post(self, request, *args, **kwargs):
     # 这里将request传给序列化类,request包含了前端传来的所有信息
        book_ser = serializers.BookModelSerializer(data=request_data,context={'request':request})
        book_ser.is_valid(raise_exception=True)
        book_result = book_ser.save()
        return Response({
            'status': 0,
            'msg': 'ok',
            'results': serializers.BookModelSerializer(book_result).data
        })
  • 序列化层
class BookModelSerializer(ModelSerializer):
    class Meta:
        model = models.Book
        fields = ('name', 'price')
    def validate_name(self, value):
        print(self.context.get('request').method)  # 此处拿的是请求方法
        return value

- data : 反序列化时,序列化类接收数据用 如:data=request_data

- instance : 序列化时,序列化类接收model类对象用 如:instance=user_obj (可省略)

- many : 序列化与反序列时,对象时多个时,需要指定 : many=True (本质是在遍历)

- partial : 反序列化时,要进行局部改时,需要指定 : partial=True 

- context : 视图类向序列化类传递数据用, 如 : context={'request':request} 序列化类内部就可以拿到request,从而拿到request中的数据

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值