1)

Django里面让Model用于JSON字段,添加一个JSONField自动类型如下:

[python] view plain copy
  1. class JSONField(models.TextField):
  2. __metaclass__ = models.SubfieldBase
  3. description = "Json"
  4. def to_python(self, value):
  5. v = models.TextField.to_python(self, value)
  6. try:
  7. return json.loads(v)['v']
  8. except:
  9. pass
  10. return v
  11. def get_prep_value(self, value):
  12. return json.dumps({'v':value})

之后就直接为Model定义JSONField类型字段了

[python] view plain copy
  1. class Category(models.Model):
  2. name = fields.MedialNameField()
  3. other= fields.JSONField()

使用很方便:

[python] view plain copy
  1. Category.objects.create(name="C1", other=(1,2,3,4,5))

所有可以被json序列化的类型都可以直接赋值给other字段,很方便吧。

2)使用postgreSql作为后端时,提供JSONField字段

  1. from django.contrib.postgres.fields import JSONField
  1. info =JSONField("时空信息",max_length=,default={},blank=True)

美化后台JSON字段:

1)自定义widget

  1. # -*- coding: utf-8 -*-
  2.  
  3. import json
  4.  
  5. from django.forms import Widget
    from django.utils.safestring import mark_safe
  6.  
  7. class JsonEditorWidget(Widget):
    """
    在 django admin 后台中使用 jsoneditor 处理 JSONField
  8.  
  9. TODO:有待改进, 这里使用 % 格式化,使用 format 会抛出 KeyError 异常
    """
  10.  
  11. 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>
  12.  
  13. <script type="text/javascript">
    var element = document.getElementById('%(name)s_editor_holder');
    var json_value = %(value)s;
  14.  
  15. 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;
    }
    });
  16.  
  17. %(name)s_editor.set({"Object": json_value})
    %(name)s_editor.expandAll()
    </script>
    """
  18.  
  19. def __init__(self, attrs=None):
    super(JsonEditorWidget, self).__init__(attrs)
  20.  
  21. def render(self, name, value, attrs=None):
    if isinstance(value, str):
    value = json.loads(value)
  22.  
  23. result = self.html_template % {'name': name, 'value': json.dumps(value),}
    return mark_safe(result)

2)在admin中引用

  1. from django.contrib import admin
    from django.contrib.postgres.fields import JSONField
  2.  
  3. from djtools import widget
  4.  
  5. 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
  6.  
  7. formfield_overrides = {
    JSONField: {'widget': widget.JsonEditorWidget}
    }
  8.  
  9. class Media:
    from django.conf import settings
    static_url = getattr(settings, 'STATIC_URL')
  10.  
  11. css = {
    'all': (static_url + 'jsoneditor.min.css', )
    }
    js = (static_url + 'jsoneditor-minimalist.min.js', )
    #Person模型管理器
    admin.site.site_header = '历史时空管理系统'
    admin.site.site_title = '历史时空'
  12.  
  13. @admin.register(Person)
    class PersonAdmin(CommonAdminMixin):
    pass
  14.  
  15. 效果:

  1. name = fields.MedialNameField()

所有可以被json序列化的类型都可以直接赋值给other字段,很方便吧。

Django笔记(2)Json字段处理的更多相关文章

  1. Django 自带 user 字段扩展及头像上传

    django 及 rest_framework 笔记链接如下: django 入门笔记:环境及项目搭建 django 入门笔记:数据模型 django 入门笔记:视图及模版 django 入门笔记:A ...

  2. Django笔记 —— Admin(Django站点管理界面)

    最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...

  3. Django笔记 —— 模型

    最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过.Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧- 本篇笔记(其 ...

  4. PG 中 JSON 字段的应用

    13 年发现 pg 有了 json 类型,便从 oracle 转 pg,几年下来也算比较熟稔了,总结几个有益的实践. 用途一:存储设计时无法预料的文档性的数据.比如,通常可以在人员表准备一个 json ...

  5. 如何用js定义数组,用js来拼接json字段

    定义js数组的方式有: var arr = (); var arr = []; var arr = new Array(); 如何拼接成一个json字段. <!DOCTYPE HTML PUBL ...

  6. django不要设置datetime字段auto_now=True

    django model的datetime字段如果设置了auto_now=True的话,update该记录的时候即使没有更新它的时间字段,它的时间字段依然会执行一遍auto_now,时间会变成当前更新 ...

  7. Django文档——Model字段类型(Field Types)

    大部分内容参考自http://wrongwaycn.github.io/django11/topics/db/models/index.html#topics-db-models ,内容是django ...

  8. Web框架——Django笔记

    Web框架--Django笔记 MVC和MTV MVC:Model.View.Controller MTV:Model.Template.View Django--MTV 1.创建Django程序   ...

  9. npm的package.json字段含义中文文档

    简介 本文档有所有package.json中必要的配置.它必须是真正的json,而不是js对象. 本文档中描述的很多行为都受npm-config(7)的影响. 默认值 npm会根据包内容设置一些默认值 ...

随机推荐

  1. java设计模式-Observe

    一.背景 请模拟下面情形: 小孩在睡觉,醒来后要求吃东西   代码: class Child{ private boolean wakenUp = false; void wakeUp(){ wake ...

  2. PHP7.1扩展开发入门

    第1步: 首先从官网下载了PHP源码http://am1.php.net/distributions/php-7.1.3.tar.bz2 第2步: 解压后可以看到根目录下面的ext文件夹里有ext_s ...

  3. C语言强化——链表(2)

    目录 链表的应用: 栈 循环队列 C语言实现动态数组 数组实现定长元素个数层次建树 队列实现不定元素个数层次建树 (*) 栈 栈(链表应用) "stack.h" #include ...

  4. C语言强化——排序

    1.完成堆排,对比堆排和qsort在排序1亿数的时间差异 #include<stdio.h> #include<time.h> #include<stdlib.h> ...

  5. [UE4]把枪打飞addImpulse

    一.武器如果没有开启模拟物理,会漂浮在空中 二.武器开启模拟物理,运行游戏的时候就会掉到地上了.之所以要加“Delay”延迟,是因为创建武器在先(没有持有人),持有武器动作在后,加上“delay”延迟 ...

  6. [UE4]移除UI(User Widget)并销毁

    1.移除UI,使用“Remove from Parent”方法 2.最后一步给UI变量赋值的时候,如果保持默认选择“Select Assets”,则会把UI变量销毁(赋值为null).

  7. [UE4]Overlay容器:图片随着其他容器(比如Vertical Box)大小而同步改变

  8. typescript泛型接口

    //函数类型接口 /* interface ConfigFn{ (value1:string,value2:string):string; } var setData:ConfigFn=functio ...

  9. tf.nn.dynamic_rnn

    tf.nn.dynamic_rnn(cell,inputs,sequence_length=None, initial_state=None,dtype=None, parallel_iteratio ...

  10. CRM N:1 关系或者字段无法删除

    点开详细信息查看那些实体引用了该组件.查看内容如下: 1 查看窗体上有无该字段; 2 查看视图中有无该字段; 3 查看试图的 筛选条件; 4 查看试图的 查找列; 5 发布之后再试试.