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会根据包内容设置一些默认值 ...
随机推荐
- java设计模式-Observe
一.背景 请模拟下面情形: 小孩在睡觉,醒来后要求吃东西 代码: class Child{ private boolean wakenUp = false; void wakeUp(){ wake ...
- PHP7.1扩展开发入门
第1步: 首先从官网下载了PHP源码http://am1.php.net/distributions/php-7.1.3.tar.bz2 第2步: 解压后可以看到根目录下面的ext文件夹里有ext_s ...
- C语言强化——链表(2)
目录 链表的应用: 栈 循环队列 C语言实现动态数组 数组实现定长元素个数层次建树 队列实现不定元素个数层次建树 (*) 栈 栈(链表应用) "stack.h" #include ...
- C语言强化——排序
1.完成堆排,对比堆排和qsort在排序1亿数的时间差异 #include<stdio.h> #include<time.h> #include<stdlib.h> ...
- [UE4]把枪打飞addImpulse
一.武器如果没有开启模拟物理,会漂浮在空中 二.武器开启模拟物理,运行游戏的时候就会掉到地上了.之所以要加“Delay”延迟,是因为创建武器在先(没有持有人),持有武器动作在后,加上“delay”延迟 ...
- [UE4]移除UI(User Widget)并销毁
1.移除UI,使用“Remove from Parent”方法 2.最后一步给UI变量赋值的时候,如果保持默认选择“Select Assets”,则会把UI变量销毁(赋值为null).
- [UE4]Overlay容器:图片随着其他容器(比如Vertical Box)大小而同步改变
- typescript泛型接口
//函数类型接口 /* interface ConfigFn{ (value1:string,value2:string):string; } var setData:ConfigFn=functio ...
- tf.nn.dynamic_rnn
tf.nn.dynamic_rnn(cell,inputs,sequence_length=None, initial_state=None,dtype=None, parallel_iteratio ...
- CRM N:1 关系或者字段无法删除
点开详细信息查看那些实体引用了该组件.查看内容如下: 1 查看窗体上有无该字段; 2 查看视图中有无该字段; 3 查看试图的 筛选条件; 4 查看试图的 查找列; 5 发布之后再试试.