Django模型序列化为json的方法示例

  

本文环境

  
      <李> 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的方法示例