rest_framework-序列化-总结完结篇

#rest_framework 序列化
from rest_framework import serializers

#serilizers.Serializer serializers.ModelSerializer 两种序列化方式

class RolesSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    title = serializers.CharField()

class RolesView(APIView):
    def get(self, request, *args, **kwargs):
        #方式1
        #roles = models.Role.objects.all().values('id','title')
        #roles = list(roles)
        #ret = json.dumps(roles, ensure_ascii=False)

        #方式2-1
        roles = models.Role.objects.all()
        ser = RolesSerializer(instance=roles, many=True)
        ret = json.dumps(ser.data, ensure_ascii=False)
        return HttpResponse(ret)

        #方式2-2
        roles = models.Role.objects.all().first()
        ser = RolesSerializer(instance=roles, many=False)
        ret = json.dumps(ser.data, ensure_ascii=False)
        return HttpResponse(ret)

class UserInfoSerializer(serializers.Serializer):
    username = serializer.CharField()
    password = serializer.CharField()
    user_type = serializer.IntegerField()

    #user_type = serializer.Charield(source="get_user_type_display")  #找到每一行的对象 row.user_type
                                                          # row.get_user_type_display  就可以对choices进行层级的字符
                                                          #可执行

    gp = serializers.CharField(source="group.title")  #外键group关联Group表,通过.获取Group表字段参数
    #显示 [{"username":"ljc", "password":"123", "user_type":"VIP", "gp":"A组"}]

    #多对多 manytomany 不能通过source  通过serializers.SerializerMethodField()
    roles = serializers.SerializerMethodField() #自定义显示
    def get_roles(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):
        users = models.UserInfo.objects.all()
        ser = UserInfoSerializer(instance=users, many=True)
        ret = json.dumps(ser.data, ensure_ascii=False)

        return HttpResponse(ret)

#方式3
class UserInfoSerializer(serializers.ModelSerializer):
    user_type = serializer.Charield(source="get_user_type_display")  #混合使用

    roles = serializers.SerializerMethodField() #自定义显示
    class Meta:
        model = models.UserInfo
        #fields = "__all__"  全部自动生成
        #fields = ['id', 'username', 'password'] #自定义
        #fields = ['id', 'username', 'password', 'user_type']
        fields = ['roles'] #复杂的

        def get_roles(self, row):

            role_obj_list = row.roles.all() #获取角色对象
            ret = []
            for item in role_obj_list:
                ret.append({'id':item.id, 'title':item.title})



class UserInfoView(APIView):
    def get(self, request, *args, **kwargs):
        users = models.UserInfo.objects.all()
        ser = UserInfoSerializer(instance=users, many=True)
        ret = json.dumps(ser.data, ensure_ascii=False)

        return HttpResponse(ret)

#小清新版
class UserInfoSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.UesrInfo
        fields = "__all__"
        depth = 1  #这个就可以将所有的数据都显示了  默认为0 只是关联本表的数据 depth最好0-4层就好了
                   #表与表之间的manytomany onetoone foreignkey 表示一层 第二个表再关联 就2层  连表操作
class UserInfoView(APIView):
    def get(self, request, *args, **kwargs):

        users = models.UserInfo.objects.all()
        ser = UserInfoSerializer(instance=users, many=True)

        ret - json.dumps(ser.data, ensure_ascii=False) #ensure_ascii=False 显示中文
        return HttpResponse(ret)

猜你喜欢

转载自www.cnblogs.com/Liang-jc/p/9399024.html
今日推荐