安装rest_framework
– pip install djangorestframework
– 注册rest_framework
序列化
– Python–json
– 第一版 用values以及JsonResponse实现序列化
– 第二版 用Django的serialize实现的序列化
– 缺点 不能序列化外键关系
– 第三版用DRF实现序列化
– 第一步声明序列化器
– 第二步 使用我们的序列化器序列化queryset
– 把模型对象放入序列化器进行字段匹配
匹配上的字段进行序列化 匹配不上丢弃
– 序列化好的数据在ser_obj.data中
– 外键关系的序列化是嵌套的序列化器对象
注意many=True
2中序列化方法:
from django.shortcuts import render
from django.http import HttpResponse,JsonResponse
from django.views import View
from djangoDome.models import Book,Publisher,Author
from django.core import serializers #django序列化
class BookView(View):
def get(self,request):
book_obj=Book.objects.values(“id”, “title”,“pub_time”, “publisher”)
book_list=list(book_obj) [{}]
ret=[]
for book in book_list:
book[“publisher”]={
“id”: book[“publisher”],
“title”: Publisher.objects.filter(id=book[“publisher”]).first().title,
}
ret.append(book)
return JsonResponse(ret,safe=False,json_dumps_params={“ensure_ascii”: False})
class BookView(View):
def get(self,request):
book_obj=Book.objects.all()
data=serializers.serialize(‘json’,book_obj,ensure_ascii=False)
return HttpResponse(data)
用第三种:
#声明序列化器
from rest_framework import serializers
class PublisherSerializer(serializers.Serializer):
id = serializers.IntegerField()
title = serializers.CharField(max_length=32)
class AuthorSerializer(serializers.Serializer):
id = serializers.IntegerField()
name = serializers.CharField(max_length=32)
class BookSerializer(serializers.Serializer):
id = serializers.IntegerField()
title = serializers.CharField(max_length=32)
pub_time = serializers.DateField()
category=serializers.CharField(source=‘get_category_display’) #此处为多选时用
publisher=PublisherSerializer() #多对一
authors=AuthorSerializer(many=True) #多对多用 many=True
from rest_framework.views import APIView #视图
from djangoDome.models import Book
from rest_framework.response import Response #相等于django的render等
from SerDemo.serializers import BookSerializer
class BookView(APIView):
def get(self,request):
book_obj=Book.objects.all()#获取所有数据
# 用序列化器进行序列化
ser_obj= BookSerializer(book_obj,many=True)
return Response(ser_obj.data)
序列化组件
– 序列化
– 反序列化 post请求
– 确定新增的数据结构
– 序列化器
– 正序和反序列化字段不统一l
– required=False 只序列化不走校验
– read_only=True 只序列化用
– write_only=True 只反序列化用
– 重写create方法
– 验证通过返回ser_obj.validated_data
– 验证不通过返回ser_obj.errors
– 反序列化 put/patch 请求
– 重写update方法
– ser_obj = BookSerializer(instance=obj, data=request.data, partial=True)
– 验证通过返回ser_obj.validated_data
– 验证不通过返回ser_obj.errors
– 验证
– 单个字段的验证 权重 222
def validate_字段名称(self, value):
不通过 raise serializers.ValidationError(“错误信息”)
通过 return value
– 多个字段的验证 权重 333
def validate(self, attrs):
attrs 是所有字段组成的字典
不通过 raise serializers.ValidationError(“错误信息”)
通过 return attrs
– 自定义的验证 权重 111
def my_validate(value):
不通过 raise serializers.ValidationError(“错误信息”)
通过 return value
配置
– 给字段加validators=[my_validate]
– ModelSerializer
– class Meta:
model = 表名
fields = “all”
# exclude = [xxxx]
depth = 1
# depth 会让所有的外键关系字段变成read_only=True
– SerializerMethodField() 方法字段
def get_字段名称(self, obj):
obj 每次序列化的模型对象
return 自定义的数据
Serializers 序列化组件