亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

Django model序列化為json的方法示例

2020-02-15 23:13:47
字體:
來源:轉載
供稿:網友

本文環境

Python 3.6.5 Django 2.0.4

fix(2018.5.19):最近得知Django 的model基類需要聲明為abstract,故在原來的代碼加入abstract聲明,以免誤導

在Django中,關于如何將model類序列化為json,一般的話有兩a器

將model類轉為字典,再使用json庫的dumps方法轉為json

第一種方法就不多講了,直接去看官方文檔就好啦

一般來說,官方提供的方法應該都是比較好用和穩定的,然而,使用官方的序列化器卻問題不少:

格式丑陋,格式如下,一言難盡:

[  {    "pk": "4b678b301dfd8a4e0dad910de3ae245b",    "model": "sessions.session",    "fields": {      "expire_date": "2013-01-16T08:16:59.844Z",      ...    }  }]

是的,其中pk指的是默認主鍵,model指的是該object的model類型,然后fields才是obj的各種字段...真的是不知如何評價了

不能很好地支持list 對于一些外鍵(包括ManyToManyField等)不是很友好 甚至對于自身的DateField也沒有很好的支持

數了一通官方序列化器的缺點,當然了,上面的幾個點肯定是有解決方案的,但是啊,我確實不想折騰了嚶嚶嚶。

于是扔出我的解決方案:

新建一個類BaseModel,此類繼承于官方的model類django.db.models.Model 在著個BaseModel中,聲明一個方法,此方法用于生成關于這個object的字典 使用這個object的字典生成json

關于生成object的字典的策略是這樣的:

通過反射獲取這個object的所有字段名 根據字段名獲得某個字段field 如果filed的類型的是int、float、str的話,直接將以 "字段名":字段值 的形式放入字典中 若field的類型是datetime或者date的話,使用date的方式處理,然后放入字典 若field的類型是BaseModel的話,那么就調用該field的getDict方法遞歸獲得該field對應的字典,然后放入字典中 若field的類型是ManyToMany類型,在具體草種中我們使用這個field的all方法來這個field的所有object,然后也是通過getDict方法將其放入到字典中

源碼及使用方法

from django.db import modelsimport jsonclass BaseModel(models.Model):  class Meta:    abstract = True  # 返回self._meta.fields中沒有的,但是又是需要的字段名的列表  # 形如['name','type']  def getMtMField(self):    pass  # 返回需要在json中忽略的字段名的列表  # 形如['password']  def getIgnoreList(self):    pass  def isAttrInstance(self, attr, clazz):    return isinstance(getattr(self, attr), clazz)  def getDict(self):    fields = []    for field in self._meta.fields:      fields.append(field.name)    d = {}    import datetime    for attr in fields:      if isinstance(getattr(self, attr), datetime.datetime):        d[attr] = getattr(self, attr).strftime('%Y-%m-%d %H:%M:%S')      elif isinstance(getattr(self, attr), datetime.date):        d[attr] = getattr(self, attr).strftime('%Y-%m-%d')      # 特殊處理datetime的數據      elif isinstance(getattr(self, attr), BaseModel):        d[attr] = getattr(self, attr).getDict()      # 遞歸生成BaseModel類的dict      elif self.isAttrInstance(attr, int) or self.isAttrInstance(attr, float) /          or self.isAttrInstance(attr, str):        d[attr] = getattr(self, attr)      # else:      #   d[attr] = getattr(self, attr)    mAttr = self.getMtMField()    if mAttr is not None:      for m in mAttr:        if hasattr(self, m):          attlist = getattr(self, m).all()          l = []          for attr in attlist:            if isinstance(attr, BaseModel):              l.append(attr.getDict())            else:              dic = attr.__dict__              if '_state' in dic:                dic.pop('_state')              l.append(dic)          d[m] = l    # 由于ManyToMany類不能存在于_meat.fields,因而子類需要在getMtMFiled中返回這些字段    if 'basemodel_ptr' in d:      d.pop('basemodel_ptr')    ignoreList = self.getIgnoreList()    if ignoreList is not None:      for m in ignoreList:        if d.get(m) is not None:          d.pop(m)    # 移除不需要的字段    return d  def toJSON(self):    import json    return json.dumps(self.getDict(), ensure_ascii=False).encode('utf-8').decode()            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产高清高潮精品美女| 国产噜噜噜噜久久久久久久久| 国产欧美一区二区白浆黑人| 亚洲精品v天堂中文字幕| 日韩在线观看免费av| 国产欧美一区二区三区四区| 亚洲精品98久久久久久中文字幕| 国产精品91在线| 精品高清美女精品国产区| 亚洲精品98久久久久久中文字幕| 久久亚洲国产精品成人av秋霞| 久久久久久网址| 久久久久国产精品免费| 欧美在线视频免费播放| 国产精品1区2区在线观看| 亚洲欧美国产一本综合首页| 国产欧美日韩专区发布| 中文字幕一区日韩电影| 亚洲国产精品va在线看黑人| 久久综合久久88| 成人中文字幕+乱码+中文字幕| 亚洲女同性videos| 69av成年福利视频| 岛国av一区二区在线在线观看| 亚洲视频自拍偷拍| 亚洲精品国产美女| 国产欧美久久一区二区| 日韩久久精品成人| 国产精品视频导航| 欧美视频一区二区三区…| www.日韩欧美| 国产成人小视频在线观看| 91视频88av| 午夜精品久久久久久久男人的天堂| 成人av在线亚洲| 亚洲精品国精品久久99热一| 成人免费福利视频| 精品久久久91| 中文字幕一精品亚洲无线一区| 久久久精品在线观看| 国产不卡在线观看| 欧美黑人极品猛少妇色xxxxx| 国产精品视频精品| 91午夜在线播放| 日韩久久精品电影| 亚洲欧美日韩成人| 国产精品女人久久久久久| 国产精品成人观看视频国产奇米| 午夜精品久久17c| 亚洲国产成人久久综合一区| 91色视频在线观看| 91久久中文字幕| 亚洲欧美国产va在线影院| 视频在线观看一区二区| 欧美大全免费观看电视剧大泉洋| 亚洲一区久久久| 菠萝蜜影院一区二区免费| 欧美性生交大片免费| 91精品在线观看视频| 国产丝袜一区视频在线观看| 欧美极品少妇全裸体| 日本91av在线播放| 91九色国产社区在线观看| 国产经典一区二区| 日韩男女性生活视频| 国产不卡在线观看| 91成人免费观看网站| 91精品国产自产在线老师啪| 亚洲精品videossex少妇| 最近2019年中文视频免费在线观看| 久久人人爽人人爽人人片av高清| 久久999免费视频| 一级做a爰片久久毛片美女图片| 亚洲免费成人av电影| 欧美在线xxx| 国产精品久久久久久久久久久新郎| 色偷偷av一区二区三区乱| 国产精品日韩精品| 亚洲精美色品网站| 97色伦亚洲国产| 午夜精品一区二区三区在线| 成人xxxxx| 欧美精品在线播放| 伦伦影院午夜日韩欧美限制| 国产精品久久久久久搜索| 欧美日韩一区二区免费视频| 午夜精品久久久久久久99黑人| 九九热视频这里只有精品| 美女福利视频一区| 国产一区二区香蕉| 成人信息集中地欧美| 亚洲成**性毛茸茸| 黑人与娇小精品av专区| 亚洲国产精品美女| 久久久国产一区二区三区| 成人黄色网免费| 精品久久久久久久久中文字幕| 欧美噜噜久久久xxx| 最近更新的2019中文字幕| 亚洲四色影视在线观看| 亚洲美女精品成人在线视频| 亚洲国产精品成人va在线观看| 成人亚洲欧美一区二区三区| 国产亚洲激情视频在线| 色樱桃影院亚洲精品影院| 国产精品极品美女在线观看免费| 日韩福利在线播放| 最好看的2019的中文字幕视频| 国产综合香蕉五月婷在线| 91色视频在线观看| 久久久久久久久久久国产| 伊人精品在线观看| 中文字幕不卡在线视频极品| 亚洲精品成人久久| 精品福利在线观看| 奇米一区二区三区四区久久| 九色成人免费视频| 欧美日韩第一视频| 国产精品香蕉在线观看| 欧美人与性动交| 日韩国产精品视频| 欧美日韩国产一区在线| 欧美wwwwww| 97avcom| 久久精品久久久久久国产 免费| 欧美专区在线观看| 国产日韩欧美一二三区| 欧美日韩国产成人| 欧美日韩中国免费专区在线看| 91av福利视频| 国产精品久久久久久久久久久久久| 午夜精品视频在线| 欧美与黑人午夜性猛交久久久| 美日韩丰满少妇在线观看| 欧美黄色免费网站| 久久视频在线观看免费| 欧美性xxxx极品高清hd直播| 一本色道久久综合亚洲精品小说| 永久免费看mv网站入口亚洲| 亚洲激情成人网| 欧美日韩激情视频8区| 亚洲男人天堂2019| 亚洲国产高清高潮精品美女| 另类专区欧美制服同性| 国产精品久久久久久久久久免费| 深夜福利91大全| 成人免费观看49www在线观看| 久久久国产影院| 欧美性资源免费| 色综合伊人色综合网站| 欧美一区二区三区图| 日韩av在线影院| 欧美另类极品videosbest最新版本| 欧美日韩一区二区在线| 日韩国产欧美精品在线| 久热国产精品视频| 国产精品自产拍高潮在线观看| 亚洲欧美日韩另类| 国产精品亚洲美女av网站| 日av在线播放中文不卡| 91精品国产自产在线老师啪| 欧美精品九九久久| 久久久久久久爱| 久久久久久久影视|