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字段

from django.contrib.postgres.fields import JSONField
info =JSONField("时空信息",max_length=500,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" >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

效果:

Django笔记(2)Json字段处理

  1.     name = fields.MedialNameField() 


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

相关文章: