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

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\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之返回链接,数据校验,保存和更新)