这类型字段格式都是一个字典类型,数据库中存储key,给客户端显示的是对应的value,可是正常的数据库操做只能读取key,拿不到value,这个时候须要用到source方法。数据库
Note
格式为:source = 'get_提取的字段名_display',便可显示valuedjango
class UserInfoSerializer(serializers.Serializer): user_type = serializers.CharField(source='get_user_type_display')
若是咱们须要在序列化类中经过本类得到外键关联的类的具体字段信息,那么也须要用到source方法,格式上略有不一样。函数
Note
格式为:source = '本类中定义的外键名.但愿得到的字段名'
本类中关联的外键名实质上就是外键的实例化对象,能够经过对象.属性的方式得到code
class UserInfoSerializer(serializers.Serializer): group = serializers.CharField(source='usergroup.title')
多对多关系中,若是用哪一个第二种方式去编写的代码得到不到具体的字段信息,本类中定义的外键名.all获得的是由具体对象组成的列表,若是但愿得到对应的每个对象的具体字段信息,须要自定义个函数来执行对象
Note开发
- 字段类型必须是:serializers.SerializerMethodField()
- 自定义函数参数传递为row, 经过row.关联的字段名.all()获取所对多中全部的关联对象信息
class UserInfoSerializer(serializers.Serializer): role = serializers.SerializerMethodField() def get_role(self, row): row_obj_list = row.role.all() # 获取到对应的全部对象列表 ret = {} for item in row_obj_list: ret[item.id] = item.title # 因为得到的是一个对象列表,因此咱们须要遍历出每个对对象,再经过对象来得到每个字段信息 return ret
Note
自定义的设置在ModelSerializer类下一样适用get
class UserInfoSerializer1(serializers.ModelSerializer): user_type = serializers.CharField(source='get_user_type_display') usergroup = serializers.CharField(source='usergroup.title') class Meta: model = UserInfo fields = ['id', 'user_type','usergroup', 'role'] depth = 1 # 自动序列化连表操做:depth表示的是在从数据库中获取数据是的深度,默认为0,表示只取最外层,当1的时候指的是再往下取一层,django设置的最大深度为10,但实际的开发中最好不要超过三层