Django接口返回JSON格式数据报文

目录

遇到问题

Django返回json结构报文

[不可行方式python json](#不可行方式python json)

可行方式JsonResponse+QuerySet.values()。


python的两个web框架,flask和django,两者都具有view 模板的章节,但是当前开发一个应用,大部分采用前后端分离的合作方式。因此必然面对的一个事情就是接口返回json格式的数据报文。本文就是针对这个事情进行了阐述,遵从了从问题产生到方案选择的过程。

遇到问题

如下为使用Django的序列化器得到的json格式数据,可以很明显的发现,这个格式和理想的fieldName:fieldData形式存在较大的差异。

复制代码
serializers.serialize('json', instance)`

`[{`
	`"model": "polls.question",`
`	"pk": 1,`
`	"fields":` `{`
		`"question_text":` `"xxxxxxxxxxx?",`
		`"pub_date":` `"2023-07-25T07:05:08Z"`
	`}`
`},` `{`
	`"model": "polls.question",`
`	"pk": 2,`
`	"fields":` `{`
		`"question_text":` `"啊啊啊啊啊",`
		`"pub_date":` `"2023-07-27T02:00:59Z"`
	`}`
`}]`
`

Django返回json结构报文

通过这个问题,引出了本文要做的事情,在Django接口中,如何将数据模型实例转换为常规的json格式并返回。

不可行方式python json

dumps会出现序列化异常,Object of type xxxxx is not JSON serializable。

可行方式JsonResponse+QuerySet.values()。

values()返回由一系列字典实例构成的QuerySet。下面对比下使用和不使用values()得到的QuerySet有什么区别。

复制代码
# 由模型对象构成.`
`>>> Blog.objects.filter(name__startswith="Beatles")`
`<QuerySet [<Blog: Beatles Blog>]>`

`# 由字典构成.`
`>>> Blog.objects.filter(name__startswith="Beatles").values()`
`<QuerySet [{'id': 1,` `'name':` `'Beatles Blog',` `'tagline':` `'All the latest Beatles news.'}]>`
`

JsonResponse作为HttpResponse的子类,对返回数据进行json编码。

接下来是简单代码样例

定义一个APIResult class:

复制代码
class APIResult(dict):`
`    def __init__(self, data):`
`        self['code'] = 200`
`        if isinstance(data, dict):`
            `print("data is dict")`
`            self['data'] = data`
`        elif isinstance(data, list):`
            `print("data is list")`
`            self['data'] = data`
        `else:`
            `print("data is not dict or list")`
`            self['data'] = list(data)`
`

返回模型实例列表:

复制代码
def question_list(request):`
`    query_set = Question.objects.all()[:5]`
`    result = APIResult(data=query_set.values())`
`    return JsonResponse(result, safe=False)`
    
`{`
	`"code": 200,`
`	"data": [{`
		`"id": 1,`
		`"question_text":` `"xxxxxxxxxxx?",`
		`"pub_date":` `"2023-07-25T07:05:08Z"`
	`},` `{`
		`"id": 2,`
		`"question_text":` `"\u554a\u554a\u554a\u554a\u554a",`
		`"pub_date":` `"2023-07-27T02:00:59Z"`
	`}]`
`}`
`

返回具体实例:

复制代码
def question_detail(request, question_id):`
    `try:`
`        query_set = Question.objects.filter(pk=question_id)`
`    except Question.DoesNotExist:`
`        raise Http404("No question")`

`    result = APIResult(data=query_set.values()[0])`
`    return JsonResponse(result)`
    
`{`
	`"code": 200,`
`	"data":` `{`
		`"id": 1,`
		`"question_text":` `"xxxxxxxxxxx?",`
		`"pub_date":` `"2023-07-25T07:05:08Z"`
	`}`
`}`
`

如果你对返回哪些字段有要求,可以向values()传入具体字段名,如values('id')。

复制代码
{"code": 200, "data": [{"id": 1},` `{"id": 2}]}`
`
相关推荐
计算机徐师兄7 小时前
Python基于Django的图片推荐系统(附源码,文档说明)
python·django·网络爬虫·图片推荐系统·python图片推荐系统·python图片推荐·图片推荐
luoluoal8 小时前
基于python的web渗透测试工具(源码+文档)
python·mysql·django·毕业设计·源码
木土雨成小小测试员10 小时前
Python测试开发之后端一
开发语言·数据库·人工智能·python·django·sqlite
WangYaolove131412 小时前
基于信息安全领域中语义搜索引擎的设(源码+文档)
python·django·毕业设计·源码·计算机源码
WangYaolove131412 小时前
基于Python的登录网站验证码的生成与识别系统(源码+文档)
python·mysql·django·毕业设计·源码
Franciz小测测12 小时前
Django 用 Loguru 完美替换标准 Logging,实现优雅的日志管理方案
django
EndingCoder1 天前
配置 tsconfig.json:高级选项
linux·前端·ubuntu·typescript·json
电商API&Tina1 天前
Python请求淘宝商品评论API接口全指南||taobao评论API
java·开发语言·数据库·python·json·php
Python毕设指南1 天前
基于深度学习的旅游推荐系统
python·深度学习·数据分析·django·毕业设计·课程设计
\xin1 天前
SQL 注入、文件上传绕过、MySQL UDF 提权、SUID 提权、Docker 逃逸,以及 APT 持久化技术渗透测试全流程第二次思路
sql·mysql·docker·容器·渗透测试·json·漏洞