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
中的内容感兴趣,所以还得进一步处理一下,等看看文档在研究研究看看能不能一步到位。