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. 数据校验
-
字段校验
在自定义Serializer或ModelSerializer类中写入校验规则 name = serializers.CharField(min_length=3,error_messages={'min_length':'姓名最短为3'}) 在视图函数: 在生成序列化类对象的时候,把要校验的数据(字典:前端传过来的)传过来 res = mySer.AuthorSerializer(data=request.data) 校验结果是一个布尔值 res.is_valid(): 如果校验失败,错误信息在这里 res.errors
-
钩子函数
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)
-
保存数据
在上面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}) 校验数据 如果校验成功保存并返回成功信息 如果校验失败返回错误信息
-
更新数据
先将更新的对象查出来以后传给自定义类的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})
网友评论