Bootstrap

python序列化工具_python_restframework(序列化)

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

;