在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面向对象编程基础解析(二)
Oct 26 Python
Python实现PS滤镜碎片特效功能示例
Jan 24 Python
基于Python socket的端口扫描程序实例代码
Feb 09 Python
Python系统监控模块psutil功能与经典用法分析
May 24 Python
详解python while 函数及while和for的区别
Sep 07 Python
在python中对变量判断是否为None的三种方法总结
Jan 23 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
Jan 20 Python
python关于变量名的基础知识点
Mar 03 Python
基于Python实现体育彩票选号器功能代码实例
Sep 16 Python
基于python实现百度语音识别和图灵对话
Nov 02 Python
python中Matplotlib绘制直线的实例代码
Jul 04 Python
分享提高 Python 代码的可读性的技巧
Mar 03 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判断所处服务器操作系统的类型
2013/06/20 PHP
php中heredoc与nowdoc介绍
2014/12/25 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
2016/11/15 PHP
ThinkPHP框架分布式数据库连接方法详解
2017/03/14 PHP
浅析PHP7的多进程及实例源码
2019/04/14 PHP
js function定义函数使用心得
2010/04/15 Javascript
js css后面所带参数含义介绍
2013/08/18 Javascript
jquery弹出框的用法示例(2)
2013/08/26 Javascript
JavaScript DOM元素尺寸和位置
2015/04/13 Javascript
jQuery实现TAB选项卡切换特效简单演示
2016/03/04 Javascript
json实现添加、遍历与删除属性的方法
2016/06/17 Javascript
JS 实现Base64编码与解码实例详解
2016/11/07 Javascript
完美解决jQuery fancybox ie 无法显示关闭按钮的问题
2016/11/29 Javascript
JS实现旋转木马式图片轮播效果
2017/01/18 Javascript
JS正则替换去空格的方法
2017/03/24 Javascript
Restify中接入Socket.io报Error:Can’t set headers的错误解决
2017/03/28 Javascript
nodejs socket实现的服务端和客户端功能示例
2017/06/02 NodeJs
node+koa2+mysql+bootstrap搭建一个前端论坛
2018/05/06 Javascript
python解析发往本机的数据包示例 (解析数据包)
2014/01/16 Python
python代码制作configure文件示例
2014/07/28 Python
在Python中使用判断语句和循环的教程
2015/04/25 Python
python基础教程之Filter使用方法
2017/01/17 Python
python提取照片坐标信息的实例代码
2019/08/14 Python
浅析python redis的连接及相关操作
2019/11/07 Python
Python 时间戳之获取整点凌晨时间戳的操作方法
2020/01/28 Python
Python numpy大矩阵运算内存不足如何解决
2020/11/19 Python
美国最流行的男士时尚网站:Touch of Modern
2018/02/05 全球购物
初中毕业生自我评价
2015/03/02 职场文书
golang switch语句的灵活写法介绍
2021/05/06 Golang
PyTorch 如何设置随机数种子使结果可复现
2021/05/12 Python
解析CSS 提取图片主题色功能(小技巧)
2021/05/12 HTML / CSS
Requests什么的通通爬不了的Python超强反爬虫方案!
2021/05/20 Python
pytorch训练神经网络爆内存的解决方案
2021/05/22 Python
Python激活Anaconda环境变量的详细步骤
2021/06/08 Python
解决Vue+SpringBoot+Shiro跨域问题
2021/06/09 Vue.js
python opencv将多个图放在一个窗口的实例详解
2022/02/28 Python