在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中使用item()方法遍历字典的例子
Aug 26 Python
python通过shutil实现快速文件复制的方法
Mar 14 Python
python数组过滤实现方法
Jul 27 Python
全面了解Nginx, WSGI, Flask之间的关系
Jan 09 Python
详谈Numpy中数组重塑、合并与拆分方法
Apr 17 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
May 29 Python
解决tensorflow测试模型时NotFoundError错误的问题
Jul 26 Python
python实现支付宝转账接口
May 07 Python
Python网络编程之使用TCP方式传输文件操作示例
Nov 01 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
Jun 30 Python
Django中F函数的使用示例代码详解
Jul 06 Python
python实现经典排序算法的示例代码
Feb 07 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连接SQLServer2005方法及代码
2013/12/26 PHP
PHP设计模式之装饰者模式代码实例
2015/05/11 PHP
CodeIgniter读写分离实现方法详解
2016/01/20 PHP
php  单例模式详细介绍及实现源码
2016/11/05 PHP
详解PHP5.6.30与Apache2.4.x配置
2017/06/02 PHP
php-app开发接口加密详解
2018/04/18 PHP
JavaScript 创建对象
2009/07/17 Javascript
js中的scroll和offset 使用比较的实例与分析
2013/09/29 Javascript
详谈angularjs中路由页面强制更新的问题
2017/04/24 Javascript
JS实现获取图片大小和预览的方法完整实例【兼容IE和其它浏览器】
2017/04/24 Javascript
一篇文章让你彻底弄懂JS的事件冒泡和事件捕获
2017/08/14 Javascript
JS实现520 表白简单代码
2018/05/21 Javascript
微信小程序实现省市区三级地址选择
2020/06/21 Javascript
tracking.js实现前端人脸识别功能
2020/04/16 Javascript
解决Vue大括号字符换行踩的坑
2020/11/09 Javascript
Python读写unicode文件的方法
2015/07/10 Python
Python字符编码判断方法分析
2016/07/01 Python
Python实现比较扑克牌大小程序代码示例
2017/12/06 Python
Python实现按照指定要求逆序输出一个数字的方法
2018/04/19 Python
对Python中gensim库word2vec的使用详解
2018/05/08 Python
tensorflow安装成功import tensorflow 出现问题
2020/04/16 Python
python中upper是做什么用的
2020/07/20 Python
python实现图书馆抢座(自动预约)功能的示例代码
2020/09/29 Python
python产生模拟数据faker库的使用详解
2020/11/04 Python
Python解析微信dat文件的方法
2020/11/30 Python
英国领先的家庭时尚品牌:Peacocks
2018/01/11 全球购物
Vilebrequin欧洲官网:法国豪华泳装品牌(男士沙滩裤)
2018/04/14 全球购物
成教毕业生自我鉴定
2013/10/23 职场文书
大学生素质拓展活动方案
2014/02/11 职场文书
《母鸡》教学反思
2014/02/25 职场文书
2014年3.15团委活动总结
2014/03/16 职场文书
5s标语大全
2014/06/23 职场文书
校长四风对照检查材料
2014/09/27 职场文书
银行催款通知书
2015/04/17 职场文书
运动会班级口号霸气押韵
2015/12/24 职场文书
单身狗福利?Python爬取某婚恋网征婚数据
2021/06/03 Python