source是序列化类中,字段类的属性,它有三种用法
用法一
from rest_framework import serializers
# 如下写法,就能修改序列化的字段
class BookSerializer(serializers.Serializer):
# 用法一:最简单,拿表中的字段
xxx = serializers.CharField(source='name')
# 前端看到:
{
"xxx": "西游记",
"price": 199,
"publish": "南京出版社"
},
# 前端应该打印name 但是用了source之后,就将name 改为了xxx
如果改为 source= "price" , 将会打印
{
"xxx": 199,
"price": 199,
"publish": "南京出版社"
},
用法二:
# 如下写法,就能修改序列化的字段
class BookSerializer(serializers.Serializer):
# 用法二 :跨表查询
# publish = serializers.CharField(source='book.publish.name') # 因为在book表中,随意book可以去掉
publish = serializers.CharField(source='publish.name') # 自动对应成出版社的名字 可以通过 . 跨表查询
原本前端看到
# 前端看到:
{
"name": "西游记",
"price": 199,
"publish": publish obj(1) # 原本对应出版社的显示内容
},
通过source跨表查询之后,得到出版社的名称
# 前端将看到
{
"name": "西游记",
"price": 199,
"publish": 南方出版社 # 跨表查询之后拿到的结果,数据库中对应的出版社的名称
},
用法三
# 字段类的属性
# 如下写法,就能修改序列化的字段
class BookSerializer(serializers.Serializer):
#用法三:这里涉及到两个地方,1 在表模型中写方法, 2 在序列化类中拿到返回值
yyy = serializers.CharField(source='get_name')
### models.py中
@property
def get_name(self):
return self.name+'sb' # 这里返回什么,序列化类中就拿到什么,前端就看到什么
# 前端看到:
{
"xxx": "西游记",
"yyy": "西游记sb", # 这个就是通过source拿到的方法,返回过来的内容
"price": 199,
"publish": "南京出版社"
},