在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获取操作系统信息实例
Sep 02 Python
基于python 字符编码的理解
Sep 02 Python
python增加矩阵维度的实例讲解
Apr 04 Python
Python3爬虫之urllib携带cookie爬取网页的方法
Dec 28 Python
PyQt5基本控件使用之消息弹出、用户输入、文件对话框的使用方法
Aug 06 Python
Python中的list与tuple集合区别解析
Oct 12 Python
Python装饰器原理与基本用法分析
Jan 07 Python
在pycharm中debug 实时查看数据操作(交互式)
Jun 09 Python
Pytorch损失函数nn.NLLLoss2d()用法说明
Jul 07 Python
python属于哪种语言
Aug 16 Python
Python实现拼音转换
Jun 07 Python
python使用pymysql模块操作MySQL
Jun 16 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提取数据库内容中的图片地址并循环输出
2010/03/21 PHP
通过PHP修改Linux或Unix口令的方法分享
2012/01/30 PHP
php实现模拟登陆方正教务系统抓取课表
2015/05/19 PHP
浅谈PHP的反射API
2017/02/26 PHP
用js获取电脑信息(是使用与IE浏览器)
2013/01/15 Javascript
javascript验证只能输入数字和一个小数点示例
2013/10/21 Javascript
jQuery+ajax实现鼠标单击修改内容的方法
2014/06/27 Javascript
10个很棒的jQuery代码片段
2015/09/24 Javascript
jQuery 1.9.1源码分析系列(十三)之位置大小操作
2015/12/02 Javascript
Angularjs注入拦截器实现Loading效果
2015/12/28 Javascript
jquery分隔Url的param方法(推荐)
2016/05/25 Javascript
jQuery动态加载css文件实现方法
2016/06/15 Javascript
Bootstrap基本组件学习笔记之下拉菜单(7)
2016/12/07 Javascript
JS设置CSS样式的方式汇总
2017/01/21 Javascript
Vue.js结合bootstrap实现分页控件
2017/03/10 Javascript
JS+HTML5 FileReader实现文件上传前本地预览功能
2020/03/27 Javascript
JS将网址url转化为JSON格式的方法
2018/07/02 Javascript
vue 实现边输入边搜索功能的实例讲解
2018/09/16 Javascript
Vue动态加载异步组件的方法
2018/11/21 Javascript
vue 移动端注入骨架屏的配置方法
2019/06/25 Javascript
VUE使用axios调用后台API接口的方法
2020/08/03 Javascript
浅谈python抛出异常、自定义异常, 传递异常
2016/06/20 Python
Python3实现的简单验证码识别功能示例
2018/05/02 Python
pandas去除重复列的实现方法
2019/01/29 Python
Python3+Appium实现多台移动设备操作的方法
2019/07/05 Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
2020/06/29 Python
设计师珠宝:Ylang 23
2018/05/11 全球购物
求职信内容考虑哪几点
2013/10/05 职场文书
扬州个园导游词
2015/02/06 职场文书
2015年度班主任自我评价
2015/03/11 职场文书
纪录片信仰观后感
2015/06/08 职场文书
小学音乐课教学反思
2016/02/18 职场文书
告诉你创业计划书的8个实用技巧
2019/07/12 职场文书
家电创业计划书
2019/08/05 职场文书
使用pandas生成/读取csv文件的方法实例
2021/07/09 Python