django之response数据json;django序列化

一、用httpresponse自定义结果,并使用json格式,返回给客户端:

import json
from django.http import HttpResponse
def get_an_apple(request):
    resp = {'errorcode': 100, 'detail': 'Get success'}
    return HttpResponse(json.dumps(resp), content_type="application/json")
print get_an_apple('asdf')
#Content-Type: application/json
{"errorcode": 100, "detail": "Get success"}

print type(get_an_apple('adsf'))
# <class 'django.http.response.HttpResponse'>

注意:使用HttpResponse时,内部必须是json字符串。即要先使用,json.dumps()。

错误示例:

import json
from django.http import HttpResponse
def get_an_apple(request):
    resp = {'errorcode': 100, 'detail': 'Get success'}
    return HttpResponse(resp, content_type="application/json")
print get_an_apple('asdf'), type(get_an_apple('adsf'))
# errorcodedetail <class 'django.http.response.HttpResponse'>

 

二、用httpresponse自定义结果,并使用application/x-www-form-urlencoded格式,返回给客户端:

import json
from django.http import HttpResponse
def get_an_apple(request):
    resp = {'errorcode': 100, 'detail': 'Get success'}
    return HttpResponse(json.dumps(resp), content_type="application/x-www-form-urlencoded")
print get_an_apple('asdf'), type(get_an_apple('adsf'))
#Content-Type: application/x-www-form-urlencoded
#{"errorcode": 100, "detail": "Get success"} <class 'django.http.response.HttpResponse'>

 

三、使用JsonResponse自定义结果,并使用json格式,返回给客户端:

import json
from django.http import HttpResponse
def get_an(request):
    resp = {'errorcode': 100, 'detail': 'Get success'}
    return JsonResponse(resp, content_type="application/json")
    # return JsonResPonse(resp)   # 同样返回的是application/json
print get_an_apple('asdf'), type(get_an_apple('adsf'))
# Content-Type: application/json
#{"errorcode": 100, "detail": "Get success"} <class 'django.http.response.HttpResponse'>

注意:与HttpsResponse相反,JsonResponse不需要先转成json字符串,直接使用数组即可。

四、使用JsonResponse自定义结果,并使用application/x-www-form-urlencoded格式,返回给客户端:

import json
from django.http import HttpResponse
def get_an(request):
    resp = {'errorcode': 100, 'detail': 'Get success'}
    return JsonResponse(resp, content_type="application/x-www-form-urlencoded")
print get_an_apple('asdf'), type(get_an_apple('adsf'))
# Content-Type: application/x-www-form-urlencoded
#{"errorcode": 100, "detail": "Get success"} <class 'django.http.response.HttpResponse'>

 

 

Django 的 object 不能直接被序列化成 json 字符串,因为 Django model 里有些 field 没有对应的序列器做序列化操作(比如 DateTimeField )

如果要直接序列化,有5种方式:

1. 在model 里自定义一个to_dict()方法,假设model类为User。

def to_dict(self):
    data = {}
    for f in self._meta.concrete_fields:
        data[f.name] = f.value_from_object(self)
    return data

然后,result = json.dumps(user.to_dict())即可

2.使用 django-rest-framework

django-rest-framework 是一个可以帮助你快速构建 REST API 的强力框架。 他拥有完善的序列化器,但在使用之前你需要花费一些时间入门, 并学习 cbv 的开发方式, 对于有时间需求的项目显然这不是最好的解决方案。

3.django.core.serializers

Django内建序列化器, 它可以序列化Django model query set 但无法直接序列化单独的Django model数据。如果你的model里含有混合数据 , 这个序列化器同样无法使用(如果你想直接使用序列化数据). 除此之外, 如果你想直接把序列化数据返回给用户,显然它包含了很多敏感及对用户无用对信息。

正确示例:

from django.core import serializers
def get_users(request):
    user_list = models.UserInfo.objects.all()
    # data = json.dumps(user_list) 这是错误的
    data = serializers.serialize('json',user_list)
    return HttpResponse(data)

 

[{“model”: “app01.userinfo”, “pk”: 1, “fields”: {“username”: “\u5174\u666e”, “password”: “123123”}}, 
{“model”: “app01.userinfo”, “pk”: 2, “fields”: {“username”: “\u90b1\u4eae”, “password”: “666”}}]

从以上返回结果可以看到,使用django.core.serializers序列化,会返回一些没用的信息

4.QuerySet.values()

和上面3一样, QuerySet.values() 同样没法工作如果你的model里有 DateTimeField 或者其他特殊的 Field 以及额外数据。

在response的时侯不能直接HttpResponse(QuerySet),因为QuerySet不能够序列化;但QuerySet.values()可以序列化。

错误示例,因为QuerySet不可序列化:

def get_users(request):
    user_list = models.UserInfo.objects.all()
    data = json.dumps(user_list)
    return HttpResponse(data)
``
这样是错误的,将抛出错误信息:

 

正确示例:QuerySet.values()

def get_users(request):
    user_list = models.UserInfo.objects.values('id', 'name')
  user_list = list(user_list) data
= json.dumps(user_list) return HttpResponse(data)

 

QuerySet.values()让使用方便,但是它有一个问题:json不能处理时间类型(datatime)。

解决办法:定制JSON

class JsonCustomEncoder(json.JSONEncoder):
    def default(self, field):
        if isinstance(field, datetime):
            return field.strftime('%Y-%m-%d %H:%M:%S')
        elif isinstance(field, date):
            return field.strftime('%Y-%m-%d')
        else:
            return json.JSONEncoder.default(self, field)

 

json.dumps(xxxx, cls=JsonCustomEncoder)

5.使用第三方模块:Django Simple Serializer

 

示例:使用 django simple serializer 进行序列化

希望可以快速简单的序列化数据, 所以我设计了一种可以不用任何额外的配置与学习而将Django data 或者 python data 序列化为相应的数据的简单的方式。 这就是为什么我写了 django simple serializer。

pip install django-simple-serializer
class Classification(models.Model):
    c_name = models.CharField(max_length=30, unique=True)

class Article(models.Model):
    caption = models.CharField(max_length=50)
    classification = models.ForeignKey(Classification, related_name='cls_art')
    content = models.TextField()
    publish = models.BooleanField(default=False)

使用django simple serializer的简单例子:

from dss.Serializer import serializer
article_list = Article.objects.all()
data = serializer(article_list)

data:

[{'read_count': 0, 'create_time': 1432392456.0, 'modify_time': 1432392456.0, 'sub_caption': u'first', 'comment_count': 0, u'id': 31}, {'read_count': 0, 'create_time': 1432392499.0, 'modify_time': 1432392499.0, 'sub_caption': u'second', 'comment_count': 0, u'id': 32}]

默认情况下, 序列器会返回一个 list 或者 dict(对于单个model实例), 你可以设置参数 “output_type” 来决定序列器返回 json/raw.

 

posted on 2018-06-20 16:43  myworldworld  阅读(845)  评论(0)    收藏  举报

导航