在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 相关文章推荐
Python中threading模块join函数用法实例分析
Jun 04 Python
Python 移动光标位置的方法
Jan 20 Python
pandas条件组合筛选和按范围筛选的示例代码
Aug 26 Python
Python操作多维数组输出和矩阵运算示例
Nov 28 Python
python脚本后台执行方式
Dec 21 Python
如何基于python实现画不同品种的樱花树
Jan 03 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
Sep 14 Python
Python爬取股票信息,并可视化数据的示例
Sep 26 Python
Python confluent kafka客户端配置kerberos认证流程详解
Oct 12 Python
python中复数的共轭复数知识点总结
Dec 06 Python
Python中OpenCV实现查找轮廓的实例
Jun 08 Python
numpy array找出符合条件的数并赋值的示例代码
Jun 01 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 levenshtein()函数用法讲解
2019/03/08 PHP
php实现登录页面的简单实例
2019/09/29 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
2019/11/26 PHP
JS实现进入页面时渐变背景色的方法
2015/02/25 Javascript
js获取数组的最后一个元素
2015/04/14 Javascript
JS实现横向与竖向两个选项卡Tab联动的方法
2015/09/27 Javascript
webpack中引用jquery的简单实现
2016/06/08 Javascript
Web程序员必备的7个JavaScript函数
2016/06/14 Javascript
jQuery 选择器(61种)整理总结
2016/09/26 Javascript
jQuery如何防止Ajax重复提交
2016/10/14 Javascript
JavaScript自定义函数实现查找两个字符串最长公共子串的方法
2016/11/24 Javascript
AngularJS使用ng-repeat和ng-if实现数据的删选显示效果示例【适用于表单数据的显示】
2016/12/13 Javascript
微信小程序 设置启动页面的两种方法
2017/03/09 Javascript
解决JS外部文件中文注释出现乱码问题
2017/07/09 Javascript
node+koa实现数据mock接口的方法
2017/09/20 Javascript
利用babel将es6语法转es5的简单示例
2017/12/01 Javascript
js使用ajax传值给后台,后台返回字符串处理方法
2018/08/08 Javascript
vuex页面刷新后数据丢失的方法
2019/01/17 Javascript
JavaScript获取某一天所在的星期
2019/09/05 Javascript
[47:02]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS paiN
2018/03/30 DOTA
Python实现模拟浏览器请求及会话保持操作示例
2018/07/30 Python
Python2和Python3.6环境解决共存问题
2018/11/09 Python
基于python3 pyQt5 QtDesignner实现窗口化猜数字游戏功能
2019/07/15 Python
python中从for循环延申到推导式的具体使用
2019/11/29 Python
Python通过kerberos安全认证操作kafka方式
2020/06/06 Python
Python调用系统命令os.system()和os.popen()的实现
2020/12/31 Python
python中time包实例详解
2021/02/02 Python
HTML5离线缓存在tomcat下部署可实现图片flash等离线浏览
2012/12/13 HTML / CSS
西班牙宠物用品和食品网上商店:Tiendanimal
2019/06/06 全球购物
介绍一下linux的文件系统
2012/03/20 面试题
民生工程实施方案
2014/03/22 职场文书
乡镇党建工作汇报材料
2014/08/14 职场文书
党的群众路线教育实践活动总结大会主持词
2014/10/30 职场文书
签订劳动合同通知书
2015/04/16 职场文书
2015年实习生工作总结报告
2015/04/28 职场文书
市场营销计划书
2019/04/24 职场文书