在django中自定义字段Field详解


Posted in Python onDecember 03, 2019

Django的Field类中方法有:

to_python() # 把数据库数据转成python数据

from_db_value() # 把数据库数据转成python数据

get_pre_value() # 把python数据压缩准备存入数据库

get_db_pre_value() # 把压缩好的数据转成数据库查询集

get_prep_lookup() # 指定过滤的条件

value_to_string() # 数据序列化

如果创建的Field比字符串,日期,整数等更复杂的数据结构,可能需要重写to_python 和from_db_value()方法(Django提供的一个SubfileBase元类,他在赋值时总是调用to_python()

一个简单的ListField 字段类型

# _*_ coding:utf-8 _*_
from django.db import models
import ast


class ListField(models.TextField):
  """自定义list字段
  models.SubfieldBase  提供to_python  和 from_db_value
  把数据库数据转化成python数据
  现在主要是from_db_value 方法 把数据库数据转化成python数据
  to_python 主要是接受form表单
  """
  __metacalss__ = models.SubfieldBase
  description = 'Stores a python list'

  

def __init__(self, *args, **kwargs):

    super(ListField,self).__init__(*args, **kwargs)

  # def db_type(self, connection):
  #   if connection.setting_dict['ENGINE'] == 'django.db.backends.mysql':
  #     return 'listtype'
  

 def from_db_value(self,value,expression,connection,context):

  """数据库数据转成python数据"""

    if value is None:
      value=[]
      return value
    if isinstance(value,list):
      return value
    return ast.literal_eval(value)


  def to_python(self, value):
    """从数据库中读取的数据转成python
    eval(value)读取value原来的类型
    ast模块就是帮助Python应用来处理抽象的语法解析的。
    而该模块下的literal_eval()函数:
    则会判断需要计算的内容计算后是不是合法的python类型,
    如果是则进行运算,否则就不进行运算。
    """
    if not value:
      value = []
    if isinstance(value, list):
      return value
    return ast.literal_eval(value)

  def get_prep_value(self, value):
    """
    把python数据压缩后保存到数据库
    或者说把python对象转化成查询值
    返回值是个字符串
    :param value:
    :return:
    """
    if value is None:
      return value
    return str(value)

  # def get_db_prep_value(self, value, connection, prepared=False):
  #   """把查询集数据转化成数据库值  一般不需要重写 只需要覆盖"""
  #   value = super(ListField, self).get_db_prep_value()
  #   if value is not None:
  #     return connection.Database.Binary(value)
  #   return value
  #

  def get_prep_lookup(self, lookup_type, value):
    """限制查询方式"""
    if lookup_type == 'exact':
      return value
    elif lookup_type == 'in':
      return [self.get_prep_value(v) for v in value]
    else:
      return TypeError('lookup type %r not supported'%lookup_type)
  

def value_to_string(self, obj):

    """转换字段数据以进行序列化
    Field._get_val_from_obj(obj) 是获取值序列化的最佳方式
    """
    value = self._get_val_from_obj(obj)
    return self.get_db_prep_value(value)

以上这篇在django中自定义字段Field详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
git进行版本控制心得详谈
Dec 10 Python
浅谈Python2获取中文文件名的编码问题
Jan 09 Python
java中两个byte数组实现合并的示例
May 09 Python
pytorch + visdom CNN处理自建图片数据集的方法
Jun 04 Python
python ddt数据驱动最简实例代码
Feb 22 Python
如何用Python做一个微信机器人自动拉群
Jul 03 Python
python opencv鼠标事件实现画框圈定目标获取坐标信息
Apr 18 Python
python实现ip地址查询经纬度定位详解
Aug 30 Python
python读取word 中指定位置的表格及表格数据
Oct 23 Python
Python调用jar包方法实现过程解析
Aug 11 Python
python 解决selenium 中的 .clear()方法失效问题
Sep 01 Python
Django中ORM的基本使用教程
Dec 22 Python
python 实现单通道转3通道
Dec 03 #Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
Dec 03 #Python
python3实现elasticsearch批量更新数据
Dec 03 #Python
python实现从wind导入数据
Dec 03 #Python
python 导入数据及作图的实现
Dec 03 #Python
python 读取数据库并绘图的实例
Dec 03 #Python
JupyterNotebook设置Python环境的方法步骤
Dec 03 #Python
You might like
第八节 访问方式 [8]
2006/10/09 PHP
php中的一个中文字符串截取函数
2007/02/14 PHP
微信获取用户地理位置信息的原理与步骤
2015/11/12 PHP
PHP处理数组和XML之间的互相转换
2016/06/02 PHP
JavaScript高级程序设计 读书笔记之九 本地对象Array
2012/02/27 Javascript
Jquery事件的连接使用示例
2013/06/18 Javascript
D3.js中data(), enter() 和 exit()的问题详解
2015/08/17 Javascript
jQuery实现对无序列表的排序功能(附demo源码下载)
2016/06/25 Javascript
JS中用try catch对代码运行的性能影响分析
2016/12/26 Javascript
Vue组件开发初探
2017/02/14 Javascript
jQuery.cookie.js使用方法及相关参数解释
2017/03/06 Javascript
Vue + Webpack + Vue-loader学习教程之功能介绍篇
2017/03/14 Javascript
vue-cli创建的项目,配置多页面的实现方法
2018/03/15 Javascript
JavaScript函数节流和函数去抖知识点学习
2018/07/31 Javascript
vuex actions传递多参数的处理方法
2018/09/18 Javascript
layui使用templet格式化表格数据的方法
2019/09/16 Javascript
转换layUI的数据表格中的日期格式方法
2019/09/19 Javascript
JS中this的4种绑定规则详解
2020/02/04 Javascript
.netcore+vue 实现压缩文件下载功能
2020/09/24 Javascript
ant design vue中表格指定格式渲染方式
2020/10/28 Javascript
详解ES6 扩展运算符的使用与注意事项
2020/11/12 Javascript
[45:34]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.18
2020/12/19 DOTA
浅谈python中的__init__、__new__和__call__方法
2017/07/18 Python
解决Python下imread,imwrite不支持中文的问题
2018/12/05 Python
对python文件读写的缓冲行为详解
2019/02/13 Python
Python3.6中Twisted模块安装的问题与解决
2019/04/15 Python
使用openCV去除文字中乱入的线条实例
2020/06/02 Python
Python调用shell cmd方法代码示例解析
2020/06/18 Python
pycharm 快速解决python代码冲突的问题
2021/01/15 Python
婚庆公司的创业计划书
2014/01/22 职场文书
安全标准化汇报材料
2014/02/03 职场文书
创建省级文明单位实施方案
2014/02/27 职场文书
经典团队口号大全
2014/06/21 职场文书
大学生职业生涯十年规划书范文
2014/09/17 职场文书
搭讪开场白台词大全
2015/05/28 职场文书
python自动化之如何利用allure生成测试报告
2021/05/02 Python