简介:restful restful就是一个接口的规范,也就是面向资源的url
- 接口视图函数只返回Json类型给前端,然后把json数据交给js,让前端的js去处理html页面变化
- 序列化器是什么呢,就是一个drf中封装了django orm的东西,用来序列化地返回和存储模型字段,也可以动态地添加非模型字段
1.序列化器
序列化要传参instance(传模型类对象),反序列化要传参data(传request中的数据)
因为是增删改查查,所以一个View不能有两个get方法,那么就分开两个视图类
一个放不需要传id的BookView, 一个放需要传id的BookDetailView,这样url中正则带id的参数和不带id的也就都分开了
导包:
from rest_framework.views import APIView
from rest_framework import serializers
from rest_framework.response import Response
1.1针对模型设置序列化器,继承原生的serializers.Serializer的序列化器
序列化器可以和view试图放在一起但是,为了解耦,最后都会单独放一块;这之中的字段名必须和模型类中的字段名相同,否则走不通,并且,is_valid()方法就是在检查serializer的这些个字段中的要求进行检验,但是有可能会和模型类中的要求起冲突,这点注意!
这五个中不需要用到serializer.save()的方法
删除方法delete:
直接找到模型类对象进行删除即可,直接返回空即可
查询所有方法get:
先用.all()查出query_set再构建序列化器对象
查看单个方法get:
就用objects.get(pk=id)得到模型类对象
赋给序列化器的instance,再用其序列化结果serializer.data返回就可以了
需要用到serializer.save()的方法
添加方法post:
当serializer.is_valid()是True,执行serializer.save()的时候,会执行序列化器类中的create()函数,该函数需要被实现,create的参数是self和validated_date;并且需要返回更新后的,模型类对象
更新方法put:
注意实例化put方法的序列化器时,instance和data都需要传,因为需要知道传什么,还需要知道向谁传参
当serializer.is_valid()是True,执行serializer.save()的时候,会执行序列化器类中的update()函数,该函数需要被实现,update的参数是instance、validated_data; 并且需要返回模型类对象,注意需要返回更新成功的模型类对象
1.2基于模型类来创建序列化器,继承serializer.ModelSerializer的序列化器
用 Meta来绑定配置模型类,这样就不需要手动地的在序列化器中写Book.objects等来查询了
并且定义了create、update方法(说明自动return),且覆盖率一对一,一对多的情况。
且试图函数一行都不用改,同时还能选择字段和自己重写重定义字段,关键字是source='原字段'
如图中就是将pub_date重写之后再将原来的pub_date排除
1.3 动态添加字段
如果是要在某个列表下加字段显示,但是该字段不是标准的模型类中的,而是需要别的来源,则需要在序列化器中进行字段拼接:序列化器中的to_representation函数就是控制序列化返回的东西,这个方法是由ModelSerializer提供的,可以在继承ModelSerializer的自定义序列化器中,重写这个方法,在重写的看到要先调用ModelSerializer中的to_representation函数将标准的模型类中的数据查询到,再进行字段的拼接。如图:
ret中的字段就是返回的字段了,在得到模型类的标准ret后,就可以动态地向ret中添加字段了
,函数get_analysis_status(ret),就是在进行字段的拼接:
不难看出,序列化器中的自定义方法是要写成类方法;下面的函数就是通过查询redis和victoria metrics (一种tsdb)来进行逻辑判断和字段的写入