django的序列化
一直有个需求,将Django的Model中的字段和值转为字典或者json数据,每次都是笨方法,一个字段一个字段装到新字典,不通用,所以就写了这篇文章。
Django的Model类有一个Model _meta ,它是Django ORM的核心,允许系统其它部分,比如查询,表单,admin等去了解每一个model。我们通过每个Model类的_meta属性访问。
比如,我现在要将一个Model的所有字段都转为json,可写一个函数:
import json
from django.db import models
def djModel2Json(obj):
result = {}
#the obj must be one Django Model class
if not isinstance(obj,models.Model):
return
for field in obj._meta.fields:
result.setdefault(field.name,getattr(obj,field.name))
return json.dumps(result)
这个方法简单通用。初次之外,django也自带了序列化和反序列化的函数和类。其功能更加全面可以序列化xml,json等。
主代码在django.core.serializers包中。
"""
Interfaces for serializing Django objects.
# Built-in serializers
BUILTIN_SERIALIZERS = {
"xml": "django.core.serializers.xml_serializer",
"python": "django.core.serializers.python",
"json": "django.core.serializers.json",
"yaml": "django.core.serializers.pyyaml",
}
用法:
from django.core import serializers
json = serializers.serialize("json", Category.objects.all())
objects = list(serializers.deserialize("json", json))
结果如下:
[{'model':'blog.category','pk':1,'fields':{'name':'web',.......}},{'model':.......}]
有model,pk,fields三个主要字段。fields就具体字段键值。
看到上述的方法,其实很简单,但是他也有一个限制,就是只能序列化Queryset。如果是通过get方法只获得一个get对象,就会出现错误。
json = serializers.serialize("json", Category.objects.get(id=1))
就会抛出:Category is not iterable.当然,对于这种问题,很好解决啊,直接将其包装成列表就好了啊。
json = serializers.serialize("json", [Category.objects.get(id=1)])
这样结果就能正常返回了。
--------EOF---------
微信分享/微信扫码阅读
微信分享/微信扫码阅读