Django queryset 序列化

写MVC模式的Django代码的时候,queryset可以直接传入Template可以直接渲染。但通过ajax请求的或者Json交互的前后分离模式就需要将orm返回的结果进行序列化。之前一直用model_to_dict来做,但这个函数有个弊端就是当数据中有不能hash的字段的时候会抛出异常,比如日期我们就得自己给单字段format。

最近发现Django自带的一个新姿势serializers,文档地址:https://docs.djangoproject.com/en/2.1/topics/serialization/

from django.core import serializers
data = serializers.serialize('json', SomeModel.objects.all(), fields=('name','size'))

支持以下序列化

Identifier Information
xml Serializes to and from a simple XML dialect.
json Serializes to and from JSON.
yaml Serializes to YAML (YAML Ain’t a Markup Language). This serializer is only available if PyYAML is installed.

使用DjangoJSONEncoder统一格式化datetime,同理可以格式化其他类型。

from django.core.serializers.json import DjangoJSONEncoder
from datetime import datetime
from django.core import serializers


class DatatimeEncoder(DjangoJSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.strftime('%Y-%m-%d %H:%M:%S')
        return super().default(obj)


data = serializers.serialize('json', SomeModel.objects.all(), cls=DatatimeEncoder)

通过serialize序列化的数据是这个结构的

[
    {
        "pk": "4b678b301dfd8a4e0dad910de3ae245b",
        "model": "sessions.session",
        "fields": {
            "expire_date": "2013-01-16T08:16:59.844Z",
            ...
        }
    }
]

一般我们只对fields中的内容感兴趣,所以还得进一步处理一下,等看看文档在研究研究看看能不能一步到位。