目录
[不可行方式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}]}`
`