本文環境
fix(2018.5.19):最近得知django 的model基類需要宣告為abstract,故在原來的**加入abstract宣告,以免誤導
在django中,關於如何將model類序列化為json,一般的話有兩a器
將model類轉為字典,再使用json庫的dumps方法轉為json
第一種方法就不多講了,直接去看官方文件就好啦
一般來說,官方提供的方法應該都是比較好用和穩定的,然而,使用官方的序列化器卻問題不少:
格式醜陋,格式如下,一言難盡:[}
]是的,其中pk指的是預設主鍵,model指的是該object的model型別,然後fields才是obj的各種欄位...真的是不知如何評價了
數了一通官方序列化器的缺點,當然了,上面的幾個點肯定是有解決方案的,但是啊,我確實不想折騰了嚶嚶嚶。
於是扔出我的解決方案:
關於生成object的字典的策略是這樣的:
原始碼及使用方法
from django.db import models
import json
class basemodel(models.model):
class meta:
abstract = true
# 返回self._meta.fields中沒有的,但是又是需要的欄位名的列表
# 形如['name','type']
def getmtmfield(self):
pass
www.cppcns.com
# 返回需要在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(kiwpofjpself, m):
attlist = getattr(self, m).all()
kiwpofjp 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()
使用方法:
models的所有類都繼承basemodel類,然後呼叫此類的tojson()方法即可
注意,不知為何,self._meta.fields中沒有包含manytomanyfield欄位,因而需要重寫getmtmfield方法。例子如下:
class book(basemodel):
name = models.charfield(max_length=50)
authors = models.manytomanyfield(author)
publish = models.foreignkey(publisher, on_delete=models.set_null, blank=true, null=true)
page = models.integerfield(default=0) # 頁數
introduction =程式設計客棧 models.charfield(max_length=500)
booktype = models.manytomanyfield(booktype, null=true, blank=true)
booktag = models.manytomanyfield(booktag, null=true, blank=true)
evaluation = models.floatfield()
coverurl = models.charfield(max_length=100, null=true, blank=true)
def getmtmfield(self):
return ['booktype', 'booktag']
結果:],
"booktag":[
]}後記
原始碼有引用,即getdict方法中的第乙個for迴圈,但懶得找原鏈結了,望見諒,特此宣告;
本文標題: django model序列化為json的方法示例
本文位址:
AMF序列化為物件和AMF序列化為二進位制位元組流
在使用flex作為頁面前端驅動socket通訊時,一般使用amf格式來進行的傳送和接收,因此就要涉及到不同的資料格式的轉換。下面提供了amf序列化為物件和amf序列化為二進位制位元組流的方法,如下 將amf格式位元組流轉換為物件 public static t amf deserializer by...
AMF序列化為物件和AMF序列化為二進位制位元組流
在使用flex作為頁面前端驅動socket通訊時,一般使用amf格式來進行的傳送和接收,因此就要涉及到不同的資料格式的轉換。下面提供了amf序列化為物件和amf序列化為二進位制位元組流的方法,如下 將amf格式位元組流轉換為物件 public static t amf deserializer by...
AMF序列化為物件和AMF序列化為二進位制位元組流
在使用flex作為頁面前端驅動socket通訊時,一般使用amf格式來進行的傳送和接收,因此就要涉及到不同的資料格式的轉換。下面提供了amf序列化為物件和amf序列化為二進位制位元組流的方法,如下 將amf格式位元組流轉換為物件 public static t amf deserializer by...