本文环境
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的各种字段...真的是不知如何评价了
数了一通官方序列化器的缺点,当然了,上面的几个点肯定是有解决方案的,但是啊,我确实不想折腾了嘤嘤嘤。
于是扔出我的解决方案:
关于生成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 # 返回需要在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()
使用方法:
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']
结果:
{ "id":4, "name":"Django从入门到放弃", "page":123, "introduction":"introduction", "evaluation":1, "bookType":[ { "id":1, "name":"类型" } ], "bookTag":[ { "id":2, "name":"tag" } ] }
后记
源码有引用,即getDict方法中的第一个for循环,但懒得找原链接了,望见谅,特此声明;
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍ASPNET中JSON的序列化和反序列化的方法,包括了ASPNET中JSON的序列化和反序列化的方法的使用技巧和注意事项,需要的朋友参考一下 一、JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式。 JSON是“名值对”的集合。结构由大括号'{}',中括号'[]',逗号',',冒号':',双引号'
这是一个特定的问题,我在Gson的javadoc中找不到关于这个话题的任何信息。 目前,我正在尝试将Json(1)解析为对象。通常我会将这些值映射到对象,并带有和字段,但是我希望更独立于API。 为了(1)我会 但是如果我们测试另一个endpoint,得到的Json(2)会是这样的 这使得我以前构造的毫无用处,我需要创建一个新的Class,其中包含相应的字段。 所以我真正的问题是: > 是否有一个
问题内容: 我需要将一些以形式表示的数据转换为。我想使用此 Java实现来执行此操作,但我不明白该怎么办。 我看了几本教程,并在Internet上阅读了一些有关内容的文章,但不了解最简单的东西:如何转换为? 例如,我在JSON中有以下代码: 我现在应该怎么办?像什么? 问题答案: 在您的数据中添加一个“ @context”条目。 您的JSON-LD处理器将完成其余工作(从0.9版开始) 作为测试,
问题内容: 我正在尝试从(1.8.json下载)使用 Minecraft json 。一个样品: 实际的json更长,大约2940行。 我需要一种不完全疯狂的反序列化方法-使用JSONUtils我可以获得4411行代码,但是同一代码不能用于任何其他版本的Minecraft。 问题答案: 自动化工具可能非常有用,但并不完美-尤其是在字典方面。 首先要注意的是,它们的结构都是相同的,即它们都由和属性组
问题内容: 我正在客户端和Django服务器之间发送信息,并且我想对此使用JSON。我正在发送简单的信息-字符串列表。我尝试使用,但是当我这样做时, 看来这只能用于Django对象。如何序列化简单的Python对象? 问题答案: 你可以使用纯Python执行此操作:
本文向大家介绍C#实现JSON字符串序列化与反序列化的方法,包括了C#实现JSON字符串序列化与反序列化的方法的使用技巧和注意事项,需要的朋友参考一下 C#将对象序列化成JSON字符串 这里主要是使用JavaScriptSerializer来实现序列化操作,这样我们就可以把对象转换成Json格式的字符串,生成的结果如下: 如何将Json字符串转换成对象使用呢? 在实际开发中,经常有可能遇到用JS传