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---------
微信分享/微信扫码阅读