【DRF-09】rest-framework之序列化(序列化)
-
1.序列化用于对用户请求数据进行验证和数据进行序列化,本篇文章主要讲解序列化部分。
- 1.1:序列化的意义:web有两种应用模式,一种是前后端不分离,一种是前后端分离,当前后端分离的时候,后端只需要向前端传输数据即可,不需要进行其他的操作,而restframework在前后端传输数据时,主要是json数据,过程中就要需要把其他数据转换成json数据,比如数据库查询所有数据时,是queryset对象,那就要把这对象处理成json数据返回前端,一般如果是中大型公司,都是前后端分离,这也是目前的市场规则需要.
-
2.自定义字段
class UserInfoSerializer(serializers.Serializer):
# 注意:source 如果是字段,会显示字段,如果是方法,会执行方法,不用加括号(authors=serializers.CharField(source='authors.all'))
username = serializers.CharField()
password = serializers.CharField()
# ut = serializers.CharField(source="user_type") # 取出来的是数字
ut = serializers.CharField(source="get_user_type_display") # row.get_user_type_display()
gp = serializers.CharField(source="group.title")
rls = serializers.SerializerMethodField() # 自定义显示
def get_rls(self,row):
role_obj_list = row.roles.all()
ret = []
for item in role_obj_list:
ret.append({"id":item.id,"title":item.title})
return ret
class UserInfoView(APIView):
def get(self,request,*args,**kwargs):
userinfo = models.UserInfo.objects.all()
# 1.实例化,一般是将数据封装到对象:__new__,__init__
ser = UserInfoSerializer(instance=userinfo,many=True,context={'request': request})
# 2.调用对象的ser.data
ret = json.dumps(ser.data,ensure_ascii=False)
return HttpResponse(ret)
- 3.基于Model自动生成字段
class UserInfoSerializer(serializers.ModelSerializer):
ut = serializers.CharField(source="get_user_type_display")
# view_name-->>url别名,pk-->>url中的组名,group_id-->>字段名
# group = serializers.HyperlinkedIdentityField(view_name='gp', lookup_field='group_id', lookup_url_kwarg='pk')
class Meta:
model = models.UserInfo
# fields = '__all__'
fields = ['id','ut','username','password','group','roles']
depth = 1
class UserInfoView(APIView):
def get(self,request,*args,**kwargs):
userinfo = models.UserInfo.objects.all()
# 1.实例化,一般是将数据封装到对象:__new__,__init__
ser = UserInfoSerializer(instance=userinfo,many=True,context={'request': request})
# 2.调用对象的ser.data
ret = json.dumps(ser.data,ensure_ascii=False)
return HttpResponse(ret)