Django 内置的serializers( 对象转成json数据)
rest_framework 序列化
- 继承 Serializers
1. 单独新建py文件, 写一个类继承Serializers
2. 在类中写要序列化的字段
from rest_framwork.serializers import Response
class BookSerializer(serializer.Serializer):
1.#以下两种方式都可,序列化出来的key 不一样
name = serializers.CharField()
title = serializers.CharField(source='name')
2.# 外键, 序列化出来的是name
publish = serializers.CharFidld(source='publish.name')
3.# source 不但可以指定字段,还可以指定表模型的方法,得到方法的返回值给xx
xx = sserializers.CharField(source='test')
# 返回出版社所有信息, 方法的返回值赋给
publish = serializers.SerializerMethodField()
def get_publish(self,obj): # get_字段名
return {'id':obj.publish.pk,'name':publish.name}
# 所有的作者详情,多对多, 可以再写一个AuthorSrializer类
authors = serializers.SerializerMethodField()
def get_authors(self,obj):
author_list = Author.objects.all()
author_ser=AuthorSerializer(author_list,many=True)
return author_ser.data
小结:
rest_framework 序列化 Serializer
1. 单独新建py文件, 写一个类继承Serializers
2. 在类中写要序列化的字段
source的三种用法:
指定字段,指定方法,跨表深度查询
3. SerializerMethodField , 配合方法使用, get_字段名(self,obj)
SerializerMethodField对应方法中可以继续使用其他的序列化类
4. views.py 中
book_ser = BookSerializer(book_list,many=True)
book_ser.data # 序列化过后的数据
继承 ModelSerializer --- 直接指定要序列化的表模型
class BookSerializer(serializers.ModelSerializer):
class Meta: # 内部类
# 指定要序列化book表
model = models.Book
# 选择要序列化的字段
# fields = ['nid','name']
# 序列化所有的字段
fields = '__all__'
# 深度, 官方建议10, 建议最多3,默认是0
#
depth = 1
# 选择不需要显示的字段,不能和fields连用
# exclude=['name']
# ---------------------以上是显示所有信息,以下是自定义显示的内容------------------
# 本来publish 所有内荣都显示,现在只显示name
# publish = serializers.CharField(source='publish.name')
# 出版社的详细信息
publish = serializers.SerializerMethodField()
def get_publish(self,obj): # obj就是那个当前要序列化的对象
return {'id':obj.publish.pk,'name':obj.publish.name}
# 5. 多对多,所有的作者详情展示出来 author_ser.data 赋值给authors
authors = serializers.SerializerMethodField()
def get_authors(self,obj): # obj 是要序列化的book
author_list = obj.author.all() # 中间相当于一个for循环
# print(author_list)
# < QuerySet[ < Author: egon >, < Author: liu >] >
# < QuerySet[ < Author: liu >] >
# 实例化一个作者的序列化对象
author_ser = AuthorSeriliazer(author_list,many=True)
return author_ser.data
#局部钩子校验, 只要是Book 的字段均可以进行局部校验
def validate_name(self,value): # value 就是name字段的值
if value.startswith('sb'):
raise ValidationError('书名不能以sb开头!')
else:
return value
#全局钩子校验
def validate(self,attrs): # 所有的都传过来
# OrderedDict([('name', 'php'), ('price', Decimal('33.00')), ('publish_date', datetime.date(2019, 3, 18)),
# ('publish', < Publish: 北京出版社 >), ('author', [ < Author: liu >])])
print(attrs) #是一个字典, 是所有属性的键值对
return attrs
小结:
rest_framework 序列化之 ModelSerializer
class BookSerializer(serializers.ModelSerializer):
1. 类内部
class Meta:
model=models.Book
fields='__all__'
# exclude=['name','price']
depth = 1