python DRF操作流程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python DRF操作流程相关的知识,希望对你有一定的参考价值。
# 其实就是Django RESTful Framework
# RESTful一种API的命名风格,主要因为前后端分离开发出现
# 前后端分离: 用户访问静态文件的服务器,数据全部由ajax请求给到
# RESTful风格:数据应该是名词,而动词由HTTP的请求方式来体现
# RESTful风格的API给前端返回 结果对象,无论什么请求方式\'\'\'特点: 反复重复因为不论什么请求方式,都需要给前端返回对象内容,就是json格式的所以每次如果有查询的结果对象都需要遍历成字典,和flask相同如果不是get请求是带有内容的请求,那从前端接收的是json格式每次都需要从request.body中拿出内容,是bytes格式然后decode解码成json字符串然后再loads成可以给python处理的字典\'\'\'\'\'\'说明:return JsonResponse(book_list, safe=False)
# 对safe的说明,我们传过去的book_list是一个list格式
# 在前端json支持{}格式也支持[]格式# 但是django中认为[]的json格式是不安全的会进行校验
# 所以把safe选项关闭False,不进行校验就可以传[]\'\'\'\'\'\'序列化:对查询结果进行遍历,然后转成字典,给到JsonResponse反序列化:接收前端json处理成字典,然后校验\'\'\'\'\'\'1.DRF框架工程搭建,建立在django的基础上安装DRF: pip install djangorestframework注册DRF: INSTALLED_APPS = [\'rest_framework\',]在子应用中serializers.py创建序列化器,用于执行序列化和反序列化在views中类视图使用序列化器,在urls中写地址\'\'\'\'\'\'2.序列化器: serializer定义: 其实ModelSerializer是Serializer的子类,更方便有模型类的序列化器的创建,实际产生的序列化器如下class BookInfoSerializer(serializers.Serializer): 实际继承Serializer """图书数据序列化器""" 序列化器:执行序列化和反序列化 id = serializers.IntegerField(label=\'ID\', read_only=True) read_only:只在输出响应中使用,就是给前端的时候,而前端给我们传请求的时候,不做验证 btitle = serializers.CharField(label=\'名称\', max_length=20) bpub_date = serializers.DateField(label=\'发布日期\', required=False) bread = serializers.IntegerField(label=\'阅读量\', required=False) bcomment = serializers.IntegerField(label=\'评论量\', required=False) image = serializers.ImageField(label=\'图片\', required=False) 字段 : 跟模型类创建很相似,具体存在的字段见讲义 还有常用的参数(就是约束)使用: 创建对象 serializer = Serializer(instance=None, data=empty, **kwarg) 说明: 序列化时,将模型类对象传入instance参数 instance = 序列化对象 反序列化时,将要被反序列化的数据传入data参数 data = 反序列化对象 可通过context参数额外添加数据 即 **kwarg : context={\'request\': request} 通过Serializer对象的context属性获取\'\'\'\'\'\'3.序列化操作 : 其实就是查询到对象之后,遍历构造字典的过程,而JsonResponse由内置的 Renderer渲染器来执行3-1.序列化只使用序列化器对象的第一个参数instanceserializer = BookInfoSerializer(instance = book)通过data属性可以获取序列化后的数据,这个data跟第二个参数可不是一个serializer.data# {\'id\': 2, \'btitle\': \'天龙八部\', \'bpub_date\': \'1986-07-24\', \'bread\': 36, \'bcomment\': 40, \'image\': None}3-2.如果要被序列化的是包含多条数据的查询集QuerySet,添加many=True参数book_qs = BookInfo.objects.all()serializer = BookInfoSerializer(book_qs, many=True)serializer.data\'\'\'\'\'\'4.关联对象嵌套序列化(由hero->book通过 hbook方法)4-1.hbook是个外键: PrimaryKeyRelatedFieldhbook = serializers.PrimaryKeyRelatedField(label=\'图书\', read_only=True)因为是外键,第二个位置必须有read_only=True 或者 查询集 queryset=BookInfo.objects.all() 要不报错serializer.data 序列化的时候 结果是 关联对象的主键 {\'hbook\': 2} 即 book.id4-2.因为id不直观,想要详细内容的字符串,把外键字段改为 : StringRelatedFieldhbook = serializers.StringRelatedField(label=\'图书\')结果: {\'hbook\': \'天龙八部\'}4-3.接口链接: HyperlinkedRelatedFieldhbook = serializers.HyperlinkedRelatedField(label=\'图书\', read_only=True, view_name=\'books-detail\')必须指明view_name参数,以便DRF根据视图名称寻找路由,进而拼接成完整URL 这个view_name传什么:url中有1个参数,是命名空间,是跟它关联 结果: {\'hbook\': \'http://127.0.0.1:8000/books/2/\'}4-4.关联对象的指定字段数据 : SlugRelatedFieldhbook = serializers.SlugRelatedField(label=\'图书\', read_only=True, slug_field=\'bpub_date\')slug_field指明使用关联对象的哪个字段结果:{\'hbook\': datetime.date(1986, 7, 24)}4-5.使用关联对象的序列化器: 直接把所属book的所有内容序列化hbook = BookInfoSerializer()结果:{\'hbook\': OrderedDict([(\'id\', 2), (\'btitle\', \'天龙八部\')te\', \'1986-07-24\'), (\'bread\', 36), (\'bcomment\', 40), (\'image\', None)])}
---------------------
以上是关于python DRF操作流程的主要内容,如果未能解决你的问题,请参考以下文章