python学习-- Django进阶之路 model的 objects对象 转 json
# objects_to_json: 将 model对象 转化成 json
# json_to_objects: 将 将反序列化的json 转为 model 对象
def json_field(field_data):
"""
将字典的键值转化为对象
:param field_data:
:return:
"""
if isinstance(field_data, str):
return "\"" + field_data + "\""
elif isinstance(field_data, bool):
if field_data == 'False':
return 'false'
else:
return 'true'
elif isinstance(field_data, unicode):
return "\"" + field_data.encode('utf-8') + "\""
elif field_data is None:
return "\"\""
else:
return "\"" + str(field_data) + "\""
def json_encode_dict(dict_data):
"""
将字典转化为json序列
:param dict_data:
:return:
"""
json_data = "{"
for (k, v) in dict_data.items():
json_data = json_data + json_field(k) + ':' + json_field(v) + ', '
json_data = json_data[:-2] + "}"
return json_data
def json_encode_list(list_data):
"""
将列表中的字典元素转化为对象
:param list_data:
:return:
"""
json_res = "["
for item in list_data:
json_res = json_res + json_encode_dict(item) + ", "
return json_res[:-2] + "]"
def objects_to_json(objects, model):
"""
将 model对象 转化成 json
example:
1. objects_to_json(Test.objects.get(test_id=1), EviewsUser)
2. objects_to_json(Test.objects.all(), EviewsUser)
:param objects: 已经调用all 或者 get 方法的对象
:param model: objects的 数据库模型类
:return:
"""
from collections import Iterable
concrete_model = model._meta.concrete_model
list_data = []
# 处理不可迭代的 get 方法
if not isinstance(object, Iterable):
objects = [objects, ]
for obj in objects:
dict_data = {}
print concrete_model._meta.local_fields
for field in concrete_model._meta.local_fields:
if field.name == 'user_id':
continue
value = field.value_from_object(obj)
dict_data[field.name] = value
list_data.append(dict_data)
data = json_encode_list(list_data)
return data
def json_to_objects(json_str, model):
"""
将 将反序列化的json 转为 model 对象
example:
Test model 预先定义
test_str = '[{"test_id":"0", "test_text":"hello json_to_objects"}]'
json_to_objects(json_str, model)
:param json_str:
:param model: objects的 数据库模型类
:return:
"""
import ast
json_list = ast.literal_eval(json_str)
obj_list = []
field_key_list = [field.name for field in model._meta.concrete_model._meta.local_fields]
for item in json_list:
obj = model()
for field in item:
if field not in field_key_list:
raise ValueError('数据库无 ' + field + ' 字段')
setattr(obj, field, item[field])
obj_list.append(obj)
return obj_list
python学习-- Django进阶之路 model的 objects对象 转 json的更多相关文章
- Python学习笔记进阶篇——总览
Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(Socket编程进阶&多线程.多进程) Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(异常处理) Pyth ...
- Python学习day08-python进阶(2)-内置方法
Python学习day08-python进阶(2)-内置方法 列表数据类型内置方法 作用 描述多个值,比如爱好 定义方法 xxxxxxxxxx 2 1 hobby_list ...
- Python学习---django之ORM的增删改查180125
模型常用的字段类型参数 <1> CharField #字符串字段, 用于较短的字符串. #CharField 要求必须有一个参数 maxlength, 用于从数 ...
- Python学习---django模板语法180122
django模板语法[Template] 模版的组成: HTML代码+逻辑控制代码 <h1> {{ user_name }} </h1> 逻辑控制代码的组成: 1.变量: ...
- Python学习---Django下的Sql性能的测试
安装django-debug-tools Python学习---django-debug-tools安装 性能测试: settings.py INSTALLED_APPS = [ ... 'app01 ...
- Python学习---django重点之视图函数
django重点之视图函数 http请求中产生两个核心对象: http请求:HttpRequest对象,由Django自己创建 http响应:HttpResponse对象,由开发自己创建,必须返回一个 ...
- python学习-- Django根据现有数据库,自动生成models模型文件
Django引入外部数据库还是比较方便的,步骤如下 : 创建一个项目,修改seting文件,在setting里面设置你要连接的数据库类型和连接名称,地址之类,和创建新项目的时候一致 运行下面代码可以自 ...
- python学习之day5,装饰器,生成器,迭代器,json,pickle
1.装饰器 import os import time def auth(type): def timeer(func): def inner(*args,**kwargs): start = tim ...
- Python学习---django之Model语法180124
django之Model语法[Models] 1 django默认支持sqlite,mysql, oracle,postgresql数据库. <1> sqlite django默认使 ...
随机推荐
- tcpick
tcpick 是一款基于文本的嗅探器,能追踪,重组和重排tcp流.
- Azure School,让你系统化快速学习人工智能
要说目前最热门的技术,非人工智能莫属了,让计算机程序能够看懂.听懂.读懂.理解我们的世界!想想就激动!! 上至高大上的个人数字化助理,下至P图软件,各种应用都开始增加AI相关的功能,试问又有哪个技术爱 ...
- JeeSite 工作流Activiti的应用实例
新建流程模型 在线办公-流程管理-模型管理-新建模型 点击“提交”后会立即跳转到“流程在线设计器”页面,请看下一章节 在线流程设计器 在线办公流程管理模型管理模型管理编辑 整体流程图 mat ...
- Android商城开发系列(十二)—— 首页推荐布局实现
首页新品推荐的布局效果如下图: 这块布局是使用LinearLayout和GridView去实现,新建recommend_item.xml,代码如下所示: <?xml version=" ...
- (转载)office 2003 gaozhi.msi 缺失提示问题修复
某些GHOST版win7,自带office 2003,每次启动word,它都会提示"稿纸没安装"云云,找不到那个文件.可是我搜遍了硬盘,确实没有那个文件.每次都要点取消,这个提示才 ...
- adc verilog spi 时序
我用的是adc081sd芯片,(由于我们使用的是FPGA不用像单片机那样考虑极性cpol,相位cpha,下面仅仅介绍下跟单片机比较下) 什么是cpol:若cs被拉为低电平时sclk(时钟)是高那么cp ...
- 【强力卸载】使用Uninstall Tool卸载各类不易卸载的软件
Uninstall Tool 经测试卸载MySql5.7.18成功. 下载地址: http://files.cnblogs.com/files/xiaohi/%E3%80%90%E8%BD%AF%E4 ...
- 用JavaScript访问SAP云平台上的服务遇到跨域问题该怎么办
关于JavaScript的跨域问题(Cross Domain)的讨论, 网上有太多的资源了.国内的程序猿写了非常多的优秀文章,Jerry这里就不再重复了. 直入主题,最近我正在做一个原型开发:通过SA ...
- 2018.5.18 AndroidStudio创建项目出错
Android Studio 出现 Gradle's dependency cache may be corrupt 错误分析 Error:Failed to open zip file. Gradl ...
- IPython安装过程 @win7 64bit
http://www.360doc.com/content/14/0902/11/16740871_406476389.shtml 为了测验测验一下IPython的应用,今天折腾了好久的从安装包msi ...