目录
遇到问题
Django返回json结构报文
不可行方式python json
可行方式JsonResponse+QuerySet.values()。
遇到问题
如下为使用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"
}]
}
返回具体实例:文章来源:https://www.toymoban.com/news/detail-611824.html
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')。文章来源地址https://www.toymoban.com/news/detail-611824.html
{"code": 200, "data": [{"id": 1}, {"id": 2}]}
到了这里,关于Django接口返回JSON格式数据报文的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!