序列化类高级用法之source
使用source,字段参数,可以修改序列化字段名字
原本序列化器中字段名,必须和表中的字段名一样,不一样会报错
我们可以通过source字段来改变序列化器中的字段名,使得前端在展示的时候也修改一下字段名!!
source也可以做跨表查询,通过外键字段,表名点外键出去的字段名字
class BookSerializer(serializers.Serializer):publish=serializers.CharField(source='publish.email')# 等价于book.publish.email 查到当前书对象的文键出版社对象然后拿到该出版社对象的邮箱
source指定的可以是字段,也可以是方法,用于重命名
小坑:不能够指定它原本的名字
序列化类高级用法之定制序列化字段的俩种方式
方式一:在【序列化类】中写SerializerMethodField
必须配合一个方法(get_字段名,需要传一个字段名接受一个参数),方法返回什么,这个字段就是什么
class BookSerializer(serializers.Serializer): name = serializers.CharField(max_length=8, min_length=3) price = serializers.IntegerField(max_value=300, min_value=10) # publish = serializers.CharField(max_length=8, min_length=3) # publish要序列化成{name:北京出版社,city:北京,email:2@qq.com} # 方式一:SerializerMethodField必须配合一个方法(get_字段名,需要传一个字段名接受一个参数),方法返回什么,这个字段就是什么 publish = serializers.SerializerMethodField() def get_publish(self, obj): # obj 就是当前序列化的对象 return {'name': obj.publish.name, 'city': obj.publish.city, 'email': obj.publish.email} # 基于对象的跨表查询 # 练习一 author = serializers.SerializerMethodField() def get_author(self, obj): res_list = [] for author in obj.authors.all(): res_list.append({'id': author.id, 'name': author.name, 'age': author.age}) return res_list
assert断言
# 框架的源码中,大量使用断言# assert :断言,作用的判断,断定一个变量必须是xx,如果不是就报错# 你的土鳖写法# name = 'lqz1'# if not name == 'lqz':# raise Exception('name不等于lqz')## print('程序执行完了')# assert的断言写法name = 'lqz1'assert name == 'lqz', 'name不等于lqz'print('程序执行完了')