在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中非常实用的一些功能和函数分享
Feb 14 Python
python Django批量导入数据
Mar 25 Python
Python+Django搭建自己的blog网站
Mar 13 Python
Python使用pyautogui模块实现自动化鼠标和键盘操作示例
Sep 04 Python
python在html中插入简单的代码并加上时间戳的方法
Oct 16 Python
pytorch逐元素比较tensor大小实例
Jan 03 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
Jun 08 Python
如何验证python安装成功
Jul 06 Python
关于Kotlin中SAM转换的那些事
Sep 15 Python
selenium与xpath之获取指定位置的元素的实现
Jan 26 Python
Python+MySQL随机试卷及答案生成程序的示例代码
Feb 01 Python
python 爬取京东指定商品评论并进行情感分析
May 27 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
基于Snoopy的PHP近似完美获取网站编码的代码
2011/10/23 PHP
关于PHP堆栈与列队的学习
2013/06/21 PHP
php统计时间和内存使用情况示例分享
2014/03/13 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
Laravel使用RabbitMQ的方法示例
2019/06/18 PHP
thinkphp5框架路由原理与用法详解
2020/02/11 PHP
PHP实现创建一个RPC服务操作示例
2020/02/23 PHP
js中的escape及unescape函数的php实现代码
2007/09/04 Javascript
js TextArea的选中区域处理
2010/12/28 Javascript
深入了解javascript中的prototype与继承
2013/04/14 Javascript
js获取和设置属性的方法
2014/02/20 Javascript
jQuery实现的一个自定义Placeholder属性插件
2014/08/11 Javascript
js实现鼠标触发图片抖动效果的方法
2015/02/27 Javascript
javascript中attachEvent用法实例分析
2015/05/14 Javascript
jQuery预加载图片常用方法
2015/06/15 Javascript
解决axios发送post请求返回400状态码的问题
2018/08/11 Javascript
vue制作抓娃娃机的示例代码
2020/04/17 Javascript
vue移动端下拉刷新和上滑加载
2020/10/27 Javascript
wxPython之解决闪烁的问题
2018/01/15 Python
利用pyinstaller将py文件打包为exe的方法
2018/05/14 Python
解决sublime+python3无法输出中文的问题
2018/12/12 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
2020/04/23 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
2020/06/02 Python
Css3实现无缝滚动防抖
2020/09/14 HTML / CSS
使用HTML5做的导航条详细步骤
2020/10/19 HTML / CSS
Tiqets英国:智能手机上的文化和娱乐门票
2019/07/10 全球购物
买房子个人收入证明
2014/01/16 职场文书
酒店拾金不昧表扬信
2014/01/18 职场文书
医学类个人求职信范文
2014/02/05 职场文书
个人借款担保书
2014/04/02 职场文书
计算机毕业大学生求职信
2014/06/26 职场文书
员工安全责任书范本
2014/07/24 职场文书
党员干部三严三实心得体会
2014/10/13 职场文书
深入理解以DEBUG方式线程的底层运行原理
2021/06/21 Java/Android
详解JSON.parse和JSON.stringify用法
2022/02/18 Javascript
Python使用socket去实现TCP客户端和TCP服务端
2022/04/12 Python