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默认使 ...
随机推荐
- 查看mysql历史命令
默认情况下操作mysql会在家目录下创建一个隐藏的mysql历史命令文件.mysql_history 在管理授权mysql账户时也会记录这些明文密码到这个文件,非常的不安全 [root@localho ...
- react爬坑之路(一)--报错output.path不是绝对路径
之前,一直在纠结是学习angular好,学习vue好,还是学习react好,网上一搜索,也是各种对比,各种互喷,看过之后更纠结.就跟小时候一样纠结长大了是上清华好,还是上北大好,最后证明我想多了.总之 ...
- IDA逆向:数组的逆向
阅读<IDA Pro权威指南>第八章,整理的一些笔记,作为逆向的基础,可能有很多认识不足. //全局分配数组 *************************************** ...
- [动态规划] uestc oj A - 男神的礼物
A - 男神的礼物 Time Limit: 3000/3000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Lweb学长 ...
- POJ-1936 All in All---字符串水题
题目链接: https://vjudge.net/problem/POJ-1936 题目大意: 给两个字符串,判断是s1是不是s2的子序列 思路: 水 #include<iostream> ...
- 【BZOJ2243】[SDOI2011] 染色(树链剖分)
点此看题面 大致题意: 有一棵\(n\)个节点的无根树和\(m\)个操作,且每个节点有一个颜色.操作有两种:一种是将两点树上路径之间所有点染成颜色\(c\),另一种是询问两点树上路径之间颜色段的数量. ...
- kubernetes-服务发现service(九)
service •防止Pod失联 •定义一组Pod的访问策略 •支持ClusterIP,NodePort以及LoadBalancer三种类型 •Service的底层实现主要有ipta ...
- linux的一些指令
linux的一些指令 █查看指令參數man 指令,如:man ls ,按q鍵退出 █查看文件列表ls -lht 按時間排序ll 列表ls 列表 目錄cd 目錄名稱 進入路徑cd .. 返回上層路徑 █ ...
- 51nod——1285 山峰和分段(暴力出奇迹)
要求每段的点数都一样,因此分的段数cnt肯定是n的因子,要求每段都有山峰,因此cnt肯定小于等于山峰数量.分段的宽度d=n/cnt,对山峰数量做一个前缀和,检查一下每一段的山峰数量是否没有增加即可. ...
- Vue入门之HelloWorld
对于新学习一门技术,一门语言比如JAVA.Python等都是从编写Hello World开始的,这样一来有益于初学者的人门,并给予初学者一定的信心,所以我也从HelloWorld开始讲起. 干货: 对 ...