美文网首页
rest_framework之返回链接,数据校验,保存和更新

rest_framework之返回链接,数据校验,保存和更新

作者: aq_wzj | 来源:发表于2018-12-12 17:57 被阅读0次

    1. HyperlinkedIdentityField,返回一个链接

    例如: 查询书籍的时候, 出版社的字段直接返回一个出版社详情的链接

    用法:

    class BookSerializer(serializers.Serializer):
        name = serializers.CharField()
        publish = serializers.HyperlinkedIdentityField(
            view_name='ttt',
            lookup_url_kwarg='pk',
            lookup_field='publish_id'
        )
    
    第一个参数: view_name 出版社详情的路由名称
    第二个参数: lookup_url_kwarg 路由里有名分组的名字
    第三个参数: lookup_field 有名分组的值
        
    出版社详情的路由
    url(r'^publish/(?P<pk>\d+)$', views.PublishDetail.as_view(),name='ttt'),
    
    视图函数中实例化时需要加上context={'request': request}属性
    class Books(APIView):
        def get(self, request):
            books = models.Book.objects.all()
            res = mySer.BookSerializer(
                instance=books, many=True,
                context={'request': request}
            )
            return JsonResponse(res.data, safe=False)
    

    2. 数据校验

    1. 字段校验

      在自定义Serializer或ModelSerializer类中写入校验规则
      name = serializers.CharField(min_length=3,error_messages={'min_length':'姓名最短为3'})
      
      在视图函数: 
          在生成序列化类对象的时候,把要校验的数据(字典:前端传过来的)传过来
          res = mySer.AuthorSerializer(data=request.data)
          校验结果是一个布尔值
          res.is_valid():
          如果校验失败,错误信息在这里
          res.errors
          
      
    2. 钩子函数

      1.局部钩子
         使用方法,在自定义类里加上一个以  validate_字段名  的方法
          def validate_name(self, value):
              if value.startswith('sb'):
                  raise ValidationError('名字不能以sb开头')
              else:
                  return value
          value为这个字段的值
          
      2.全局钩子
       使用方法,在自定义类里加上一个以  validate  的方法
          def validate(self, values):
              if values['name']==values['sex']:
                  raise ValidationError('你疯了吧,名字等于性别??')
              else:
                  return values
          values为字段验证通过的所有数据
      

    3. 保存和更新数据到数据库:(必须继承ModelSerializer)

    1. 保存数据

      在上面2.1的字段校验res.is_valid():成功后调save()方法
      def post(self, request):
          
          res = mySer.AuthorSerializer(data=request.data)
          if res.is_valid():
              res.save()
              return JsonResponse({'status': 100, 'msg': '添加成功'})
          return JsonResponse({'status': 101, 'msg': res.errors})
      校验数据
      如果校验成功保存并返回成功信息
      如果校验失败返回错误信息
      
    1. 更新数据

      先将更新的对象查出来以后传给自定义类的instance参数
      除此之外与上面都一样
      
      def put(self, request, pk):
          obj=models.Author.objects.filter(pk=pk).first()
          
          res=mySer.AuthorSerializer(instance=obj,data=request.data)
          if res.is_valid():
              res.save()
              return JsonResponse({'status': 100, 'msg': '修改成功'})
          return JsonResponse({'status': 101, 'msg': res.errors})
      

    相关文章

      网友评论

          本文标题:rest_framework之返回链接,数据校验,保存和更新

          本文链接:https://www.haomeiwen.com/subject/uwpphqtx.html