在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中正则表达式的用法实例汇总
Aug 18 Python
Python随手笔记第一篇(2)之初识列表和元组
Jan 23 Python
Python3 循环语句(for、while、break、range等)
Nov 20 Python
python Flask实现restful api service
Dec 04 Python
Python3实现购物车功能
Apr 18 Python
解决Python安装后pip不能用的问题
Jun 12 Python
浅谈Python中eval的强大与危害
Mar 13 Python
Python参数解析模块sys、getopt、argparse使用与对比分析
Apr 02 Python
Python求均值,方差,标准差的实例
Jun 29 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
Jul 14 Python
Tensorflow tensor 数学运算和逻辑运算方式
Jun 30 Python
实例详解Python的进程,线程和协程
Mar 13 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
ini_set的用法介绍
2014/01/07 PHP
PHP Ajax实现无刷新附件上传
2016/08/17 PHP
PHP中Session ID的实现原理实例分析
2019/08/17 PHP
JS加ASP二级域名转向的代码
2007/05/17 Javascript
js 页面输出值
2008/11/30 Javascript
jquery 图片Silhouette Fadeins渐显效果
2010/02/07 Javascript
javascript:void(0)使用探讨
2013/08/27 Javascript
js借助ActiveXObject实现创建文件
2013/09/29 Javascript
javascript 实现子父窗体互相传值的简单实例
2014/02/17 Javascript
浏览器窗口加载和大小改变事件示例
2014/02/27 Javascript
jquery获取颜色在ie和ff下的区别示例介绍
2014/03/28 Javascript
jQuery判断元素是否显示 是否隐藏的简单实现代码
2016/05/19 Javascript
JS中使用变量保存arguments对象的方法
2016/06/03 Javascript
js当前页面登录注册框,固定div,底层阴影的实例代码
2016/10/04 Javascript
使用Ajax和Jquery配合数据库实现下拉框的二级联动的示例
2018/01/25 jQuery
在vue中使用express-mock搭建mock服务的方法
2018/11/07 Javascript
vue-cli 目录结构详细讲解总结
2019/01/15 Javascript
Vue实现远程获取路由与页面刷新导致404错误的解决
2019/01/31 Javascript
详解超简单的react服务器渲染(ssr)入坑指南
2019/02/28 Javascript
使用vue中的混入mixin优化表单验证插件问题
2019/07/02 Javascript
vue 使用 sortable 实现 el-table 拖拽排序功能
2020/12/26 Vue.js
PHP魔术方法__ISSET、__UNSET使用实例
2014/11/25 Python
1 行 Python 代码快速实现 FTP 服务器
2018/01/25 Python
python广度优先搜索得到两点间最短路径
2019/01/17 Python
Python面向对象总结及类与正则表达式详解
2019/04/18 Python
Python列表操作方法详解
2020/02/09 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
2020/04/29 Python
CSS3中文字镂空、透明值、阴影效果设置示例小结
2016/03/07 HTML / CSS
解决canvas转base64/jpeg时透明区域变成黑色背景的方法
2016/10/23 HTML / CSS
Gloeilampgoedkoop荷兰:在线购买灯泡
2019/02/16 全球购物
MUGLER官方网站:蒂埃里·穆勒香水
2019/11/26 全球购物
Java如何格式化日期
2012/08/07 面试题
入党介绍人评语
2014/05/06 职场文书
物业管理专业求职信
2014/06/11 职场文书
钳工实训报告总结
2014/11/04 职场文书
nginx实现多geoserver服务的负载均衡
2022/05/15 Servers