一、模型类序列化器的使用
1、原来用的Serilizer跟表模型没有直接联系,模型类序列化器ModelSerilizer,跟表模型有对应关系
2、ModelSerializer与常规的Serializer相同,但提供了:
(1)基于模型类自动生成一系列字段
(2)基于模型类自动为Serializer生成validators,比如unique_together
(3)包含默认的create()和update()的实现
3、具体使用
class BookModelSerializer(serializers.ModelSerializer):
# publish = serializers.CharField(max_length=32,source='publish.name') # 重写某些字段,例如显示名字
class Meta:
model = models.Book # 跟哪个表模型建立关系
fields = '__all__' # 序列化的字段,反序列化的字段
# exclude = ['title'] # 排除哪些字段(不能和fields同时使用)
# depth = 1
# read_only_fields=['price','publish'] # 序列化显示的字段
# write_only_fields=['title'] # 反序列化需要传入的字段
# extra_kwargs = {'title':{'max_length':32,'write_only':True}}
# depth = 1 # 跨表查询,外键一个表就1,最多建议写3
#局部钩子和全局钩子和BookSerializer一样
4、新增、修改
在模型类序列化器中统统不用重写create和update方法,在ModelSerializer内部已经重写了这两个方法
二、高级用法之SerializerMethodField
主要是为了拿到关联表中的字段数据
#Serializer中
class BookSerializer(serializers.Serializer):
id = serializers.IntegerField(required=False)
name = serializers.CharField(max_length=32,min_length=2,source='title')
price = serializers.DecimalField(max_digits=5, decimal_places=2)
publish = serializers.SerializerMethodField()
def get_publish(self,obj):
dic={'name':obj.publish.name,'addr':obj.publish.addr}
return dic
#模型类序列化器中
class BookModelSerializer(serializers.ModelSerializer):
class Meta:
model = models.Book
fields = '__all__'
publish = serializers.SerializerMethodField()
def get_publish(self,obj):
dic={'name':obj.publish.name,'addr':obj.publish.addr}
return dic
#使用序列化类的嵌套实现
class PublishSerializer(serializers.ModelSerializer):
class Meta:
model = models.Publish
# fields = '__all__'
fields = ['name','addr']
class BookModelSerializer(serializers.ModelSerializer):
publish = PublishSerializer()
class Meta:
model = models.Book
fields = '__all__'
三、drf的请求与响应
1、Request:
data:前端以post请求提交的数据都在它里面
FILES:前端提交的文件
query_params:就是原来的request.GET
内部重写了getattr:使用新的request.method其实就是原生request.method,原理是通过反射实现
2、Response
data:响应的字典
status:http响应的状态码(drf提供了所有的状态码,以及它的意思)
template_name:模板名字
headers:响应头,字典
content_type:响应的编码方式
四、自己手动封装了一个response,继承drf的Response
在app中创建一个名为utils.py的文件,自定义一个CommonResponse的类
#utils.py
class CommonResponse:
def __init__(self):
self.code = 100
self.msg = ''
@property
def get_dic(self):
return self.__dict__
#视图函数中导入自定义的类,再实例化,以后就可以用点取值
from app01.utils import CommonResponse
class BookDetail(APIView):
def put(self,request,id,*args,**kwargs):
# res = {'code':'修改成功','msg':''}
res = CommonResponse()
try:
book = models.Book.objects.get(id = id)
ser = BookModelSerializer(instance=book,data=request.data) ser.is_valid(raise_exception=True)
ser.save()
# res['msg']='修改成功'
# res['result']=ser.data
res.msg = '修改成功'
except Exception as e:
# res['code'] = 101
# res['msg'] = str(e)
res.code = 101
res.msg = str(e)
return Response(res.get_dic)
五、配置模板
通过配置,选择默认模板的显示形式(浏览器方式,Json方式)
配置文件方式(全局)
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': ( # 默认响应渲染类
'rest_framework.renderers.JSONRenderer', # json渲染器
'rest_framework.renderers.BrowsableAPIRenderer', # 浏览API渲染器
)
}
如果没有配置,默认有浏览器和json,drf中有默认配置文件
from rest_framework.settings import DEFAULTS
在视图类中配置(局部)
粒度更小
class BookDetail(APIView):
renderer_classes=[JSONRenderer,]