【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)
posted @ 2024-06-03 21:09  Tony_xiao  阅读(8)  评论(0编辑  收藏  举报