我们做前后端分离后端的主要任务就是返回 json 格式的数据,一下是利用 django 自带的 view 返回 json 的例子。
但是这个方法存在这许多不足(有些数据在返回的时候因为没有就行序列化所以会出错)。
一、使用 view 的方法返回 json
1.新建项目,并且新建app
2.在app的 views 中 导入 View 并且编写视图
3.在视图中定义一个列表用来存放json数据
4.定义一个字典用来实时添加json数据(字典形式 )
5.把字典添加到列表中
6.导入 HttpResponse 以及 json
7.使用 HttpResponse 返回 json数据 (content_type="application/json" 这个要加上)
json.dumps(json_list) 是在做序列化 ,
但是有些 东西不能再这里做序列化。比如 datatime
from django.views.generic.base import View
class TestView(View):
def get(self,request):
print 'hello django'
json_list = []
json_dict = {}
json_dict['name'] = 'xiaoming'
json_dict['id'] = 5
json_list.append(json_dict)
from django.http import HttpResponse
import json
return HttpResponse(json.dumps(json_list), content_type="application/json")
8.配置路由 ,在 urls 中先导入 TestView ,再给他配置路由
from restapp.views import TestView
url(r'^test/$',TestView.as_view(),name='test'),
此时运行项目访问 http://127.0.0.1:8000/test/ 就能得到 json 数据 。
扩展 :
1.当表中数据过多,又不想把字段一个个添加到字典中时,
可以使用 model_to_dict 一次性转换
from django.forms.models import model_to_dict
for good in goods:
json_dict = model_to_dict(good)
json_list.append(json_dict)
这样得到的结果跟 json_dict['name'] = 'xiaoming' 这样一个个添加是一样的 。
2.即使这样,还是有许多 model 里面的字段不能直接 serializable (序列化)
那如何才能把所有字段都序列化呢?
可以导入 django 的 serializers
from django.core import serializers
json_data = serializers.serialize("json", goods) # goods 为某 model 的查询集
json_data = json.load(json_data)
from django.http import JsonResponse
return JsonResponse(json_data,safe=False)
这样也可以将所有的查询结果转换为 json 数据 返回,而且解决了序列化的 问题。
但是这样还存在一些问题,比如我返回图片的时候, serializers 返回的是一串路径,
但是如果我们的 手机端接收的话,接收后还要加上域名等七七八八的东西。
而 django的 restframework 就自动帮我们把这些做好了。
还有就是字段排列 , serializers 返回的已经定死了