目录结构

1.前言

2.JsonResponse类的源码简单分析

3.【方案1:使用方法serializers】的具体方案实现流程

4.【方案2:使用方法model_to_dict】的具体方案实现流程

5.【方案3:使用方法value跟方法list结合】的具体方案实现流程

1.前言

django的ORM框架提供的查询数据库表数据的方法很多,不同的方法返回的结果也不太一样,不同方法都有各自对应的使用场景。

主要常用的查询方法个数是13个,方法返回值是可迭代对象QuerySet的方法只有这8个:all(),filter(),exclude(),order_by(),reverse(),values(),values_list(),distinct();

如果前端人员要求接口返回值的数据类型是json,后端人员要对接口返回值为可迭代对象QuerySet的值通过其他方法间接转成非可迭代对象和非json的数据类型的值并把该值当成JsonResponse类初始化时的其中一个入参data的值,最终把JsonResponse类初始化后的对象当做最终的接口返回值提供给前端人员。

把接口返回值为可迭代对象QuerySet的值通过其他方法间接转成json的数据类型的值的所谓方案,目前只有这3种方案(我们只需要记住这3种即可):

⑴.方案1:使用方法serializers

主要作用:把接口返回值为可迭代对象QuerySet的值转为json的数据类型(即转为python语言里的数据类型为字符串的数据类型)的值;

(这种方案只需要做了解即可,基本用不到)

⑵.方案2:使用方法model_to_dict

主要作用:把接口返回值为可迭代对象QuerySet的值转为python语言里的数据类型为dict的数据类型的值;

(这种方案只需要做了解即可,基本用不到)

⑶.方案3:使用方法value跟方法list结合

主要作用:把接口返回值为可迭代对象QuerySet的值转为python语言里的数据类型为list的数据类型的值;

(这种方案最简单,基本都会用这个,要重点知道怎么用)

细节:

①.问题:为什么视图函数返回值返回给前端页面的数据的数据类型有时需要为json?

大概答案:

目前大多数公司研发团队都是采取前后端分离进行项目开发,可以大大提高项目开发效率和提高维护效率。

所以前端开发人员一般会要求后端开发人员把接口返回值转成数据类型为json的数据传给前端开发人员,前端开发人员拿到该数据类型为json的数据后再单独进行处理并获取到自己想要的字段数据去进行对应html页面的数据加载渲染。

②.问题:json这个数据类型要怎么理解?

大概答案:

json这个数据类型,其实数据类型就是字符串。

json这个数据类型可以理解为是美元,全世界的每个国家都可以通过美元进行交易。

而python提供的任何数据类型都可以理解为人民币,java提供的任何数据类型都可以理解为欧元,php提供的任何数据类型都可以理解为日元,c语言提供的任何数据类型都可以理解为港币,html需要的数据类型必须只能为json。

所以,无论是哪种后端语言编写的接口返回值,如果前端人员要求接口返回值的数据类型是json,后端人员要对接口返回值做数据类型的转化即把原先的数据类型(比如python语言的list数据类型/dict数据类型)转成json的数据类型后才能当成最终的接口返回值。

2.JsonResponse类的源码简单分析

细节:

①.json是目前常用的一种数据格式,有时候我们后端开发人员需要给前端开发人员返回一个json格式的数据,而JsonResponse类就能满足这样的需求。

②.通过【from django.http import JsonResponse】和【class JsonResponse(HttpResponse)】,我们可以知道JsonResponse类它是HttpResponse的的一个子类,从父类继承大部分行为,用来帮助创建json的响应。

2.1.JsonResponse类的源码如下所示

class JsonResponse(HttpResponse):
"""
An HTTP response class that consumes data to be serialized to JSON. :param data: Data to be dumped into json. By default only ``dict`` objects
are allowed to be passed due to a security flaw before EcmaScript 5. See
the ``safe`` parameter for more information.
:param encoder: Should be a json encoder class. Defaults to
``django.core.serializers.json.DjangoJSONEncoder``.
:param safe: Controls if only ``dict`` objects may be serialized. Defaults
to ``True``.
:param json_dumps_params: A dictionary of kwargs passed to json.dumps().
""" def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,
json_dumps_params=None, **kwargs):
if safe and not isinstance(data, dict):
raise TypeError(
'In order to allow non-dict objects to be serialized set the '
'safe parameter to False.'
)
if json_dumps_params is None:
json_dumps_params = {}
kwargs.setdefault('content_type', 'application/json')
data = json.dumps(data, cls=encoder, **json_dumps_params)
super().__init__(content=data, **kwargs)

2.2.JsonResponse类的构造函数里的每个入参的大概含义和作用

①.入参【data】:应该传递一个数据类型为dict的值给它(也可以不传一个数据类型为dict的值给它),它将其转换成 json 格式的数据。   

②.入参【encoder】:默认值为django.core.serializers.json.DjangoJSONEncoder或DjangoJSONEncoder,用于序列化data。(关于序列化的更多知识点可以百度搜索json序列化进行学习,目前只需要了解要这么用即可)   

③.入参【safe】 : 默认值为True。如果值设置为False,表示可以传递任何对象(比如list/tuple/dict)进行序列化;如果值设置为True,而第一个参数data的值不是dict对象,将抛出一个TypeError。

④.入参【json_dumps_params】:默认值为None。在django1.9版本中新增的入参,可以传递一个python里的json库里的json.dump() 方法处理后的对象给该入参当入参值,用于生成一个响应。(了解即可)

3.【方案1:使用方法serializers】的具体方案实现流程

3.1.第一步:先编写相关代码内容的视图函数

3.2.第二步:在任一浏览器访问该网址【http://127.0.0.1:8000/search_person_data/】,查看结果页面的数据展示

3.3.第三步:可以把接口返回值拿到该网站【https://www.json.cn/】进行解析和格式化,便于直观查看

3.4.第四步:查看打印的日志信息,看是否符合预期结果

4.【方案2:使用方法model_to_dict 】的具体方案实现流程

4.1.第一步:先编写相关代码内容的视图函数

4.2.第二步:在任一浏览器访问该网址【http://127.0.0.1:8000/search_person_data/】,查看结果页面的数据展示

4.3.第三步:查看打印的日志信息,看是否符合预期结果

5.【方案3:使用方法value跟方法list结合】的具体方案实现流程

5.1.第一步:先编写相关代码内容的视图函数

5.2.第二步:在任一浏览器访问该网址【http://127.0.0.1:8000/search_person_data/】,查看结果页面的数据展示

5.3.第三步:查看打印的日志信息,看是否符合预期结果

细节:

①.【方案3:使用方法value()跟方法list结合】是主流常用的方案,后续我们进行平台开发时尽量选择这个方案3即可。

django学习-16.返回给前端页面数据为json数据类型的3种方案的更多相关文章

  1. 返回给前端样式数据整合Swagger

    对于前端样式整合swagger,只对接口做增强,不对接口逻辑做修改,当json样式拼接完成,我们把json转为对应的实体类即可. 前端json样式对象构造参考:https://workshops.ot ...

  2. vue keep-alive 实现详情返回列表保留页面数据

    实现功能 详情页返回列表页,列表页保留上次浏览位置 其它页面进入到列表表,列表页刷新 当详情页有数据改变时,列表页也要更新该条数据 实现思路 用keep-alive保留列表页面数据 activated ...

  3. Django学习笔记(8)——前后台数据交互实战(AJAX)

    这里将自己这段时间学习的关于前后台数据交互的笔记写在这里,这里包含了Django传输数据给JS,AJAX的相关问题,跨域问题,如何解决AJAX的跨域问题等等.比较凌乱,请看到这篇博客的盆友见谅,如果我 ...

  4. Django学习之十三:提高页面开发效率减少冗余的模板系统

    目录 Django 模板 模板语法 逻辑语法 函数式过滤器 内置filter 功能tag 注释 内置tag 导入三方tag and filter(load) 过滤器和功能tag的区别 自定义tag和f ...

  5. Flask--第三个例子,写一个接口,该接口返回html前端页面,模板的使用

     将接口数据返回至html前端页面有两种方法 方法一: 1 @app.route('/index',methods=['get']) 2 def open_index(): 3 page=open(' ...

  6. django学习-22.admi管理后台页面的文案展示等相关配置

    目录结果 1.前言 2.完整的操作步骤 2.1.第一步:对[settings.py]里的相关常量的值做如下修改 2.2.第二步:重启django项目[helloworld]的服务 2.3.第三步:重新 ...

  7. MVC使用Newtonsoft无需实体类,实现JSON数据返回给前端页面使用

    //引用using Newtonsoft.Json; using Newtonsoft.Json.Linq; public ActionResult JsonSample() { ResponseRe ...

  8. mockjs学习总结(方便前端模拟数据,加快开发效率)

      基本介绍: 在我们前端开发中经常遇到这样的事情,接口没有写好,只能写静态页面,如何才能用很简单的方法模拟后端数据呢?mockjs就干了这件事,而且干的还挺好. 下面是我作为初学者的一些总结经验,期 ...

  9. django 学习-16 Django会话Cookie

    1.django.admin.py  startproject   cs3 cd cs3 django.admin.py   startapp   blog 2.    vim urls.py url ...

随机推荐

  1. List对象集合根据组合属性进行差集运算

    背景   当List是一个基本数据类型的集合的时候,进行集合运算还比较方便,但是有这么一些业务场景,比如某个用户权限变化的列表,或者取数据的变化结果,当时有时候用笨方法多循环两次也是可以的,只不过代码 ...

  2. Vue3(三)CND + ES6的import + 工程化的目录结构 = 啥?

    突发奇想 这几天整理了一下vue的几种使用方式,对比之后发现有很多相似之处,那么是不是可以混合使用呢?比如这样: vue的全家桶和UI库,采用传统的方式加载(CND.script). 自己写的js代码 ...

  3. 利用PWM脉宽调制实现呼吸灯

    1.设计目标 完成一个呼吸灯,从亮到灭的时间为2秒,从灭到亮的时间为2秒,以此不断往复. 2.设计步骤 2.1设计分析 利用PWM(脉冲宽度调制)实现led灯亮度的变化,只需要改变占空比就可以实现,具 ...

  4. Flink-v1.12官方网站翻译-P015-Glossary

    术语表 Flink Application Cluster Flink应用集群是一个专用的Flink集群,它只执行一个Flink应用的Flink作业.Flink集群的寿命与Flink应用的寿命绑定. ...

  5. B - How Many Tables (多少桌)

    题目大致意思: 有n个人在一起吃饭,有些人互相认识.认识的人想坐在一起,不想跟陌生人坐.例如A认识B,B认识C,那么A.B.C会坐在一张桌子上. 给出认识的人,问需要多少张桌子 Today is Ig ...

  6. 2019牛客暑期多校训练营(第八场)B-Beauty Values(期望线性性)

    >传送门< 题意:思路:期望的线性性(可加性),比赛的时候写的代码超级无敌长,不过值得欣慰的是一发AC了,官方的题解写的还不错~ 我们可以把每种数字对答案的贡献分开来计算,即枚举每个数字, ...

  7. Codeforces Round #613 (Div. 2) C. Fadi and LCM(LCM & GCD)

    题意: LCM(a, b) = X,求 max(a, b) 的最小值. 思路: a, b 只可能存在于 X 的因子中,枚举即可. #include <bits/stdc++.h> usin ...

  8. easyx学习心得

    前几天算法课的实验要求实现可视化,搞了半天没动咋实现,然后有大佬说用easyx,,,我寻思着也没教这玩意咋用啊.然后很烦躁的上网找教程,发现没有教怎么使用的,都说有一本说明书(链接),自己调用函数就可 ...

  9. 【uva 12174】Shuffle(算法效率--滑动窗口)

    题意:假设一种音乐播放器有一个乱序的功能,设定每播放S首歌为一个周期,随机播放编号为1~S的歌曲.现在给一个长度为N的部分播放记录,请统计下次随机排序所发生的时间的可能性种数.(1≤S,N≤10000 ...

  10. Codeforces Round #660 (Div. 2) A. Captain Flint and Crew Recruitment、Captain Flint and a Long Voyage

    题目链接:Captain Flint and Crew Recruitment 题意: t组输入,每一组输入一个n.这里我们说一下题目定义的近似质数概念: "如果可以将正整数x表示为p⋅q, ...