在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 相关文章推荐
Pyramid Mako模板引入helper对象的步骤方法
Nov 27 Python
Windows系统下安装Python的SSH模块教程
Feb 05 Python
详解Python中类的定义与使用
Apr 11 Python
利用Python进行异常值分析实例代码
Dec 07 Python
Python设计模式之MVC模式简单示例
Jan 10 Python
对Tensorflow中的变量初始化函数详解
Jul 27 Python
使用memory_profiler监测python代码运行时内存消耗方法
Dec 03 Python
Django 使用easy_thumbnails压缩上传的图片方法
Jul 26 Python
python线程中的同步问题及解决方法
Aug 29 Python
快速解释如何使用pandas的inplace参数的使用
Jul 23 Python
Python实现弹球小游戏
Aug 01 Python
Golang Web 框架Iris安装部署
Aug 14 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
PHP IDE phpstorm 常用快捷键
2015/05/18 PHP
javascript让setInteval里的函数参数中的this指向特定的对象
2010/01/31 Javascript
ie9 提示'console' 未定义问题的解决方法
2014/03/20 Javascript
浅谈 jQuery 事件源码定位问题
2014/06/18 Javascript
javascript常用方法汇总
2014/12/02 Javascript
原生javascript实现的一个简单动画效果
2016/03/30 Javascript
JS实现动画兼容性的transition和transform实例分析
2016/12/13 Javascript
Vue实现动态显示textarea剩余字数
2017/05/22 Javascript
Bootstrap Table使用整理(三)
2017/06/09 Javascript
JavaScript插件Tab选项卡效果
2017/11/14 Javascript
深入理解 webpack 文件打包机制(小结)
2018/01/08 Javascript
如何通过setTimeout理解JS运行机制详解
2019/03/23 Javascript
详解Vue项目中实现锚点定位
2019/04/24 Javascript
JS计算两个数组的交集、差集、并集、补集(多种实现方式)
2019/05/21 Javascript
Vue学习笔记之计算属性与侦听器用法
2019/12/07 Javascript
pandas 获取季度,月度,年度首尾日期的方法
2018/04/11 Python
在python环境下运用kafka对数据进行实时传输的方法
2018/12/27 Python
python+opencv 读取文件夹下的所有图像并批量保存ROI的方法
2019/01/10 Python
python实现二维数组的对角线遍历
2019/03/02 Python
pytorch 实现模型不同层设置不同的学习率方式
2020/01/06 Python
Pytorch对Himmelblau函数的优化详解
2020/02/29 Python
浅谈python量化 双均线策略(金叉死叉)
2020/06/03 Python
Python3实现建造者模式的示例代码
2020/06/28 Python
Python内置函数及功能简介汇总
2020/10/13 Python
C#的几个面试问题
2016/05/22 面试题
shell变量的作用空间是什么
2013/08/17 面试题
团员学习总结的自我评价范文
2013/10/14 职场文书
老人祝寿主持词
2014/03/28 职场文书
《英英学古诗》教学反思
2014/04/11 职场文书
工作评语大全
2014/04/26 职场文书
国际贸易专业求职信
2014/06/04 职场文书
出售房屋委托书范本
2014/09/24 职场文书
村党的群众路线教育实践活动工作总结
2014/10/25 职场文书
社区环境卫生倡议书
2015/04/29 职场文书
《勇者辞职不干了》ED主题曲无字幕动画MV公开
2022/04/13 日漫
如何用H5实现好玩的2048小游戏
2022/07/23 HTML / CSS