django 中 serializer 用法

安装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序列化

用values 方法获取

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})

django的序列化

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 序列化组件

你可能感兴趣的:(django 中 serializer 用法)