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‘)
- 表模型中添加 __str__
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
原文地址:https://blog.51cto.com/xiong51/2395181
时间: 2024-11-10 04:39:35