Django笔记(2)Json字段处理
1)
Django里面让Model用于JSON字段,添加一个JSONField自动类型如下:
- class JSONField(models.TextField):
- __metaclass__ = models.SubfieldBase
- description = "Json"
- def to_python(self, value):
- v = models.TextField.to_python(self, value)
- try:
- return json.loads(v)['v']
- except:
- pass
- return v
- def get_prep_value(self, value):
- return json.dumps({'v':value})
之后就直接为Model定义JSONField类型字段了
- class Category(models.Model):
- name = fields.MedialNameField()
- other= fields.JSONField()
使用很方便:
- Category.objects.create(name="C1", other=(1,2,3,4,5))
所有可以被json序列化的类型都可以直接赋值给other字段,很方便吧。
2)使用postgreSql作为后端时,提供JSONField字段
from django.contrib.postgres.fields import JSONField
info =JSONField("时空信息",max_length=,default={},blank=True)
美化后台JSON字段:
1)自定义widget
# -*- coding: utf-8 -*- import json from django.forms import Widget
from django.utils.safestring import mark_safe class JsonEditorWidget(Widget):
"""
在 django admin 后台中使用 jsoneditor 处理 JSONField TODO:有待改进, 这里使用 % 格式化,使用 format 会抛出 KeyError 异常
""" html_template = """
<div id='%(name)s_editor_holder' style='padding-left:170px'></div>
<textarea hidden readonly class="vLargeTextField" cols="40" id="id_%(name)s" name="%(name)s" rows="20">%(value)s</textarea> <script type="text/javascript">
var element = document.getElementById('%(name)s_editor_holder');
var json_value = %(value)s; var %(name)s_editor = new JSONEditor(element, {
onChange: function() {
var textarea = document.getElementById('id_%(name)s');
var json_changed = JSON.stringify(%(name)s_editor.get()['Object']);
textarea.value = json_changed;
}
}); %(name)s_editor.set({"Object": json_value})
%(name)s_editor.expandAll()
</script>
""" def __init__(self, attrs=None):
super(JsonEditorWidget, self).__init__(attrs) def render(self, name, value, attrs=None):
if isinstance(value, str):
value = json.loads(value) result = self.html_template % {'name': name, 'value': json.dumps(value),}
return mark_safe(result)
2)在admin中引用
from django.contrib import admin
from django.contrib.postgres.fields import JSONField from djtools import widget from .models import Person,Tag# Register your models here.
class CommonAdminMixin(admin.ModelAdmin):
"""Common Admin Mixin"""
list_max_show_all = 20
list_per_page = 20 formfield_overrides = {
JSONField: {'widget': widget.JsonEditorWidget}
} class Media:
from django.conf import settings
static_url = getattr(settings, 'STATIC_URL') css = {
'all': (static_url + 'jsoneditor.min.css', )
}
js = (static_url + 'jsoneditor-minimalist.min.js', )
#Person模型管理器
admin.site.site_header = '历史时空管理系统'
admin.site.site_title = '历史时空' @admin.register(Person)
class PersonAdmin(CommonAdminMixin):
pass 效果:

- name = fields.MedialNameField()
所有可以被json序列化的类型都可以直接赋值给other字段,很方便吧。
Django笔记(2)Json字段处理的更多相关文章
- Django 自带 user 字段扩展及头像上传
django 及 rest_framework 笔记链接如下: django 入门笔记:环境及项目搭建 django 入门笔记:数据模型 django 入门笔记:视图及模版 django 入门笔记:A ...
- Django笔记 —— Admin(Django站点管理界面)
最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...
- Django笔记 —— 模型
最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...
- PG 中 JSON 字段的应用
13 年发现 pg 有了 json 类型,便从 oracle 转 pg,几年下来也算比较熟稔了,总结几个有益的实践. 用途一:存储设计时无法预料的文档性的数据.比如,通常可以在人员表准备一个 json ...
- 如何用js定义数组,用js来拼接json字段
定义js数组的方式有: var arr = (); var arr = []; var arr = new Array(); 如何拼接成一个json字段. <!DOCTYPE HTML PUBL ...
- django不要设置datetime字段auto_now=True
django model的datetime字段如果设置了auto_now=True的话,update该记录的时候即使没有更新它的时间字段,它的时间字段依然会执行一遍auto_now,时间会变成当前更新 ...
- Django文档——Model字段类型(Field Types)
大部分内容参考自http://wrongwaycn.github.io/django11/topics/db/models/index.html#topics-db-models ,内容是django ...
- Web框架——Django笔记
Web框架--Django笔记 MVC和MTV MVC:Model.View.Controller MTV:Model.Template.View Django--MTV 1.创建Django程序 ...
- npm的package.json字段含义中文文档
简介 本文档有所有package.json中必要的配置.它必须是真正的json,而不是js对象. 本文档中描述的很多行为都受npm-config(7)的影响. 默认值 npm会根据包内容设置一些默认值 ...
随机推荐
- spring线程池(同步、异步)
一.spring异步线程池类图 二.简单介绍 2.1. TaskExecutor---Spring异步线程池的接口类,其实质是java.util.concurrent.Executor 以下是官方已经 ...
- 服务注册发现consul之二:在Spring Cloud中使用Consul实现服务的注册和发现
首先安装consul环境,参照之前的文章:<服务注册发现consul之一:consul介绍及安装>中的第一节介绍. Spring Cloud使用Consul的服务与发现 1.导入依赖pri ...
- [UE4]爆头和穿墙
一.LineTracebyChannel的Out Hit值展开后有一个名为“Hit Bone Name”(击中的骨骼名称),以此来判断击中的是否是头部,进而实现爆头的目的(爆头:高伤害,一枪毙命) 二 ...
- [UE4]Task的定义与使用
在Task蓝图里面可以像普通蓝图一样添加函数.变量. 也可以通过使用“set blackboard value as”设置黑板变量,使用“get blackboard value as”获得黑板变量值 ...
- ELK 日志查询分析nginx日志
# ======================== Elasticsearch Configuration ========================= # # NOTE: Elasticse ...
- MyBatis配置Mapping,JavaType和JDBCType的对应关系,#与$区别
Mybatis中javaType和jdbcType对应关系:JDBC Type Java TypeCHAR StringVARCHAR StringLONGVARCHAR StringNUMERIC ...
- C#根据进程名称获取进程的句柄?
C#根据进程名称获取进程的句柄或C#如何获取其他进程的句柄? 有时候标题名是动态变化的,所以不使用FindWindow方法! [StructLayout(LayoutKind.Sequential)] ...
- SSH2 No Session found for current thread原因
Hibernate4 与 spring3 集成之后, 如果在取得session 的地方使用了getCurrentSession, 可能会报一个错:“No Session found for curre ...
- php删除字符串最后一位
一.前言 从数据库中select()读取一对多的信息时,经常需要将取出的数组用某个特定的字符分割,然后拼接成字符串. 常见的语法格式: foreach ($arr as $key => $val ...
- Can't create handler inside thread that has not called Looper.prepare()
Looper.prepare(); // Can't create handler inside thread that has not called Looper.prepare(). Toast. ...