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

2022-09-28 03:18:14 字數 3571 閱讀 6384

本文環境

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...