本文环境
-
<李> Python 3.6.5李>
<李> Django 2.0.4李>
修复(2018.5.19):最近得知Django的模型基类需要声明为抽象的,故在原来的代码加入抽象声明,以免误导
在Django中,关于如何将模型类序列化为json,一般的话有两个器
将模型类转为字典,再使用json库的转储方法转为json
第一种方法就不多讲了,直接去看官方文档就好啦
一般来说,官方提供的方法应该都是比较好用和稳定的,然而,使用官方的序列化器却问题不少:
格式丑陋,格式如下,一言难尽:
( { “pk”:“4 b678b301dfd8a4e0dad910de3ae245b”, “模型”:“sessions.session”, “字段”:{ “expire_date”:“2013 - 01 - 16 t08:16:59.844z”, … } } )
是的,其中pk指的是默认主键,模型指的是该对象的模型类型,然后才字段是obj的各种字段…真的是不知如何评价了
-
<李>不能很好地支持李>列表
<李>对于一些外键(包括ManyToManyField等)不是很友好李>
<李>甚至对于自身的DateField也没有很好的支持李>
数了一通官方序列化器的缺点,当然了,上面的几个点肯定是有解决方案的,但是啊,我确实不想折腾了嘤嘤嘤。
于是扔出我的解决方案:
-
<李>新建一个类BaseModel,此类继承于官方的模型类django.db.models.Model李>
<李>在着个BaseModel中,声明一个方法,此方法用于生成关于这个对象的字典李>
<李>使用这个对象的字典生成json李>
关于生成对象的字典的策略是这样的:
-
<李>通过反射获取这个对象的所有字段名李>
<李>根据字段名获得某个字段字段李>
<李>如果提交的类型的是整数,浮点数、str的话,直接将以“字段名”:字段值的形式放入字典中李>
<李>若字段的类型是datetime或者日期的话,使用日期的方式处理,然后放入字典李>
<李>若字段的类型是BaseModel的话,那么就调用该字段的getDict方法递归获得该领域对应的字典,然后放入字典中李>
<李>若字段的类型是多类型,在具体草种中我们使用这个字段的所有方法来这个领域的所有对象,然后也是通过getDict方法将其放入到字典中李>
<>强源码及使用方法强>
django。数据库导入模型 进口json 类BaseModel (models.Model): 类元: 摘要=True #返回self._meta.fields中没有的,但是又是需要的字段名的列的表 #形如(“名称”、“类型”) def getMtMField(自我): 通过 #返回需要在json中忽略的字段名的列的表 #形如(“密码”) def getIgnoreList(自我): 通过 def isAttrInstance(自我,attr, clazz): 返回isinstance (getattr(自我,attr) clazz) def getDict(自我): 字段=[] 在self._meta.fields: fields.append (field.name) d={} 进口日期时间 attr领域: 如果isinstance (getattr(自我,attr) datetime.datetime): d [attr]=getattr(自我,attr)。strftime (“% Y - % m - H % d %: % m: % S ') elif isinstance (getattr(自我,attr) datetime.date): d [attr]=getattr(自我,attr) .strftime (Y ' % - % - % d ') #特殊处理datetime的数据 elif isinstance (getattr(自我,attr) BaseModel): d [attr]=getattr(自我,attr) .getDict () #递归生成BaseModel类的东西 elif自我。isAttrInstance (attr, int)或自我。isAttrInstance \ (attr,浮动) 或自我。isAttrInstance (attr, str): d [attr]=getattr(自我,attr) 其他: # d [attr]=getattr(自我,attr) mAttr=self.getMtMField () 如果mAttr不是没有: 在mAttr m: 如果hasattr(自我,m): attlist=getattr(自我,m) () l=[] 对于attr attlist: 如果isinstance (attr, BaseModel): l.append (attr.getDict ()) 其他: dic=attr.__dict__ 如果在dic _state”: dic.pop (“_state”) l.append (dic) d [m]=l #由于多类不能存在于_meat.fields,因而子类需要在getMtMFiled中返回这些字段 如果“basemodel_ptr”d: d.pop (“basemodel_ptr”) ignoreList=self.getIgnoreList () 如果ignoreList不是没有: 在ignoreList m: 如果d.get (m)不是没有: d.pop (m) #移除不需要的字段 返回维 def toJSON(自我): 进口json 返回json.dumps (self.getDict (), ensure_ascii=False) .encode (utf - 8) .decode ()Django模型序列化为json的方法示例