django自带的序列化工具serializers
三步骤
导入 from django.core import serializers
生成对象并传参 response = serializers.serialize('json', book_list)
第一个json是解析器,说明要解析成json格式的字符串,
第二个是queryset对象,
最后返回结果 return JsonResponse(response, safe=False)
safe 为false说明不是正经的json格式,里面有可能套了列表 元组以及其它的格式字符串
from app01 import models
from django.shortcuts import render, HttpResponse
from django.core import serializers
from django.http import JsonResponse
from rest_framework.views import APIView
class BookManage(APIView):
def get(self, request, *args, **kwargs):
book_list = models.Book.objects.all()
# serialize(format, queryset, **options)
# 格式, 传queryset对象, 其它选项
response = serializers.serialize('json', book_list)
# safe=False 如果不设置这个 当字典中还有其它的 如列表,返回就会报错
return JsonResponse(response, safe=False)
如下图, 字典中的字段无用的就太多了会给网络带来拥堵
drf的Serializer的简单使用
三步骤
导入 from rest_framework import serializers
写一个类,继承 serializers.Serializer
class BookSerializers(serializers.Serializer)
类的方法中生成对象 bsl = BookSerializers(instance=book_list, many=True)
many=true 说明queryset对象中有多条,
many=false 说明字典中只有一条数据
from app01 import models
from django.shortcuts import render, HttpResponse
from django.http import JsonResponse
from rest_framework.views import APIView
from rest_framework import serializers
# Create your views here.
class BookSerializers(serializers.Serializer):
# 必须要注意的是 这个序列化组件的值 必须是序列化中字典中存在的值!!
name = serializers.CharField()
price = serializers.DecimalField(max_digits=5, decimal_places=2)
class BookManage(APIView):
def get(self, request, *args, **kwargs):
book_list = models.Book.objects.all()
# 初始化方法 def __init__(self, instance=None, data=empty, **kwargs)
# many 如果传true就说明有多条, kwargs.pop('many', None)
# many 传false说明就只有一条字典
bsl = BookSerializers(instance=book_list, many=True)
return JsonResponse(bsl.data, safe=False)
[{"name": "1111", "price": "11.11"}, {"name": "2222", "price": "22.22"}]
如果不想要其中的一个结果, 直接在serializers中注释或删除即可
# name = serializers.CharField() 注释它之后
[{"price": "11.11"}, {"price": "22.22"}, {"price": "33.33"}, {"price": "44.44"}]
drs下的Serializer下的方法
source属性
更改前台查看的名称 source="name"
class BookSer(serializers.Serializer):
bookname = serializers.CharField(source="name")
前台中的字典就会将name更改成为 "bookname": "python",
多表操作
表模型中添加 __str__
当前台字典直接以对象的结果返回时,后台只需要 更改source
"publish": "Publish object (2)"
models对应的模型添加
def __str__(self):
return self.name
使用source 指定字段
指字表模型中存在的段, 这个publish如果有source之后就可以随意更改
publish = serializers.CharField(source='publish.city')
source="publish.city" 最终查询是 book.publish.city 进行查询
表模型中添加 使用一个方法
在返回对象的表模型中添加一个方法, 然后在serializers中用source 直接查询
def get_city(self):
return self.city
publish = serializers.CharField(source='publish.get_city')
SerializerMethodField
自定义方法
authors = serializers.SerializerMethodField()
# 需要传一个参数, 其实就是后台views传过来的 返回结果book_obj
# msg = BookSer(book_obj, many=True)
def get_authors(self, book):
msg = [{"author_name": author.name, "age": author.age} for author in book.authors.all()]
return msg
# 列表生成式, 返回的结果就是
{"publish":"xx出版社",
"authors": [
{"name":"xx",
"age":11}]
}
直接将查询的结果 序列化
class Authors(serializers.Serializer):
name = serializers.CharField()
age = serializers.IntegerField()
class BookSer(serializers.Serializer):
# 使用 SerializerMethodField 可以指定一个方法
authors = serializers.SerializerMethodField()
def get_authors(self, book):
auth_obj = book.authors.all()
msg = Authors(auth_obj, many=True)
return msg.data
# 结果与列表生成式的一样
drs下的ModelSerializer
fields方法
获取全部的
# 这个表下所有的字段都会在前台展示
class BookSer(serializers.ModelSerializer):
# 这个是固定格式
class Meta:
model = models.Book
fields = "__all__"
类似于白名单
class BookSer(serializers.ModelSerializer):
# 这个是固定格式
class Meta:
model = models.Book
fields = ["nid","publish"] # 只要这两个
# 如果写了自定义的值,那么这个名称就需要与fields中定义的一样
publish = serializers.CharField(source="publish.name")
类似于黑名单,过滤, 不能与fields同时存在
class BookSer(serializers.ModelSerializer):
# 这个是固定格式
class Meta:
model = models.Book
exclude = ["authors"] # 过滤掉它
查询深度
class BookSer(serializers.ModelSerializer):
# 这个是固定格式
class Meta:
model = models.Book
fields = "__all__"
# 官方建议是不要超过10的深度, 一层一层的查询, 实际中使用最好不要超过3层
depth = 1
sqlite 如果有时间那么查询的话,会有超长的错误提示
Meta下的方法
重写方法
# 这个表下所有的字段都会在前台展示
class BookSer(serializers.ModelSerializer):
# 这个是固定格式
class Meta:
model = models.Book
fields = "__all__"
# 重写方法 在Meta下
publish = serializers.CharField(source="publish.name")
也可以用序列化的方式
authors = serializers.SerializerMethodField()
def get_authors(self, obj):
auth = obj.authors.all()
msg = Authors(auth, many=True)
return msg.data