restframework序列化使用方法

serializers.Serializer
class Userinfoserializers(serializers.Serializer):
    username = serializers.CharField()
    passwd = serializers.CharField()
    group = serializers.CharField(source="group.title")
        #使用序列化的原因:
        #因为在传统的前后端不分离后台返回给前端的数据类型为Queryset对象而不是可视化对象所以我们可以通过rest_framework的serializers类将Queryset对象变成我们想要的数据格式
        #当source参数存在的时候会直接通过source的参数作为键到数据库取值,如果不存在则通过变量名为键取值
        #当source参数不存在时,键为变量名,且通过变量名为键取值
        #当source数据源明确时可以自定义变量名为响应数据的键  oooo = serializers.CharField(source=“username”)
        #source参数也可以为一个方法在内部会自动加上括号比如source="get_字段名_display"
        #也可以通过外键取值source="group.title"

class Userinfo_view(APIView):
    def get(self,request,*args,**kwargs):
    
        #实现的原理如下通过返回的对象调用values方法返回指定的字段值
        #info = models.UserInfo.objects.all().values("id","username","passwd")
        
        mdl = models.UserInfo.objects.all()
        
        #many 为传入的数据为多条的话为True 如果不是一个列表只有一条的话则为False
        ser = Userinfoserializers(instance=mdl,many=True)
        info = json.dumps(ser.data,ensure_ascii=False)
        return HttpResponse(info)
 
   

自定义显示

 

class Userinfoserializers(serializers.Serializer):
    username = serializers.CharField()
    passwd = serializers.SerializerMethodField()

    #此处的value为一个Queryser对象get_字段名
    def get_passwd(self,value):
        return value.passwd


class Userinfo_view(APIView):
    def get(self,request,*args,**kwargs):
        mdl = models.UserInfo.objects.all()
        ser = Userinfoserializers(instance=mdl,many=True)
        info = json.dumps(ser.data,ensure_ascii=False)
        return HttpResponse(info)

 

 

 

 

生成 HyperlinkedIdentityField

 

生成HyperlinkedIdentityField
url(r"^(?P[v1|v2]+)/group/(?P\d+)$",views.Groupinfo_view.as_view(),name="group"),

class Userinfoserializers(serializers.ModelSerializer):
    #lookup_field=此参数必须在路有中出现,view_name="group"找寻的是路由别名,也决定了他的生成格式
    group = serializers.HyperlinkedIdentityField(view_name="group",lookup_field="group_id")
    class Meta:
        model = models.UserInfo
        fields = "__all__"
        
class Userinfo_view(APIView):
    def get(self,request,*args,**kwargs):
        mdl = models.UserInfo.objects.all()
        #必填参数context={"request":request}
        ser = Userinfoserializers(instance=mdl,many=True,context={"request":request})
        info = json.dumps(ser.data,ensure_ascii=False,)
        return HttpResponse(info)

 

serializers.ModelSerializer
    #两者也可配合使用
    class Userinfoserializers(serializers.ModelSerializer):
    class Meta:
    
        #深度控制,此处的值为多少层表默认为0
        depth = 1 #0-10
        model = models.UserInfo
        
        #显示所有字段
        # fields = "__all__"
        
        #此处可以自定义显示的字段
        fields = ["id","username","passwd","user_type","group"]
        
        #此处通过字典的方式也可以取到对应的外键的值
        extra_kwarges = {"group":{"source":"group.title"},}
        
         #也可以自定义字段
            class MyField(serializers.CharField):
                #此处接收value为Queryset对象
                def to_representation(self,value):
                    return valu
 请求数据校验
 
    
class Roleser(serializers.ModelSerializer):
title = serializers.CharField(min_length=3,max_length=5,error_messages={"min_length":"字数不能低于3","max_length":"字数不能大于5"})

def validate_title(self, attrs):#对指定字段进行自定义校验
print(attrs)#销售2
return attrs
def validate(self, attrs):#对多个字段进行校验
print(attrs)#OrderedDict([('title', '销售2')])
return attrs
 
    
class Roles_view(APIView):
def get(self,request,*args,**kwargs):
obj = models.Role.objects.all()
ser = Roleser(instance=obj,many=True)
return Response(ser.data)

def post(self,request,*args,**kwargs):
ser = Roleser(data=request.data)
if ser.is_valid():
ser.save()
return Response("提交成功")
else:
return Response(ser.errors)
 
 
   

 

 

 

 

 

 

转载于:https://www.cnblogs.com/longwenzhang/p/10250924.html

你可能感兴趣的:(restframework序列化使用方法)