在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之不要红头文件(1)
Sep 28 Python
菜鸟使用python实现正则检测密码合法性
Jan 05 Python
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
Mar 30 Python
Python获取指定文件夹下的文件名的方法
Feb 06 Python
详解django.contirb.auth-认证
Jul 16 Python
python 抓包保存为pcap文件并解析的实例
Jul 23 Python
安装2019Pycharm最新版本的教程详解
Oct 22 Python
Python 复平面绘图实例
Nov 21 Python
python GUI库图形界面开发之PyQt5滚动条控件QScrollBar详细使用方法与实例
Mar 06 Python
QT5 Designer 打不开的问题及解决方法
Aug 20 Python
在Python中实现字典反转案例
Dec 05 Python
如何在向量化NumPy数组上进行移动窗口
May 18 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解析http获取的json字符串变量总是空白null
2015/03/02 PHP
jQuery对象的selector属性用法实例
2014/12/27 Javascript
浅谈Javascript中的Function与Object
2015/01/26 Javascript
JS运动框架之分享侧边栏动画实例
2015/03/03 Javascript
JavaScript数组的定义及数字操作技巧
2016/06/06 Javascript
canvas 弹幕效果(实例分享)
2017/01/11 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
2017/06/17 Javascript
JS实现元素上下左右移动效果
2017/10/18 Javascript
浅谈jquery中ajax跨域提交的时候会有2次请求的问题
2017/11/10 jQuery
axios简单实现小程序延时loading指示
2018/07/30 Javascript
基于vue-router 多级路由redirect 重定向的问题
2018/09/03 Javascript
Vue 组件参数校验与非props特性的方法
2019/02/12 Javascript
Openlayers实现地图全屏显示
2020/09/28 Javascript
javascript实现时钟动画
2020/12/03 Javascript
[03:32]2014DOTA2西雅图邀请赛 CIS外卡赛赛前black专访
2014/07/09 DOTA
[00:57]林俊杰助阵DOTA2亚洲邀请赛
2015/01/28 DOTA
Python入门篇之数字
2014/10/20 Python
Python搭建HTTP服务器和FTP服务器
2017/03/09 Python
python正则表达式爬取猫眼电影top100
2018/02/24 Python
Python爬虫之UserAgent的使用实例
2019/02/21 Python
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
2019/03/05 Python
python爬虫 基于requests模块发起ajax的get请求实现解析
2019/08/20 Python
简单了解python调用其他脚本方法实例
2020/03/26 Python
pandas dataframe 中的explode函数用法详解
2020/05/18 Python
python3通过qq邮箱发送邮件以及附件
2020/05/20 Python
Python socket服务常用操作代码实例
2020/06/22 Python
python实现自动清理重复文件
2020/08/24 Python
CSS3 transition 实现通知消息轮播条
2020/10/14 HTML / CSS
大学生毕业自我鉴定范文
2013/09/19 职场文书
函授本科毕业生自我鉴定
2013/10/16 职场文书
英语自荐信范文
2013/12/11 职场文书
联谊活动策划书
2014/01/26 职场文书
小学教师党员承诺书
2015/04/27 职场文书
初中政治教学反思
2016/02/23 职场文书
干货:如何写好工作计划!
2019/05/17 职场文书
Spring Bean是如何初始化的详解
2022/03/22 Java/Android