在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 相关文章推荐
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
May 22 Python
Python的time模块中的常用方法整理
Jun 18 Python
Python的Django框架中的数据库配置指南
Jul 17 Python
Python中getattr函数和hasattr函数作用详解
Jun 14 Python
利用Python批量生成任意尺寸的图片
Aug 29 Python
Python实现的tcp端口检测操作示例
Jul 24 Python
python中对数据进行各种排序的方法
Jul 02 Python
Django上线部署之IIS的配置方法
Aug 22 Python
Python正则表达式急速入门(小结)
Dec 16 Python
Python yield生成器和return对比代码实例
Apr 20 Python
python使用selenium爬虫知乎的方法示例
Oct 28 Python
一文带你掌握Pyecharts地理数据可视化的方法
Feb 06 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
安健A254立体声随身听的分析与打磨
2021/03/02 无线电
php设计模式 Observer(观察者模式)
2011/06/26 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
2013/07/01 PHP
PHP将两个关联数组合并函数提高函数效率
2014/03/18 PHP
PHP实现的博客欢迎提示功能(很特别哦)
2014/06/05 PHP
PHP防止注入攻击实例分析
2014/11/03 PHP
php实现文章评论系统
2019/02/18 PHP
小型js框架veryide.librar源代码
2009/03/05 Javascript
jquery按回车提交数据的代码示例
2013/11/05 Javascript
详解js静态资源文件请求的处理
2017/08/01 Javascript
详解Angular2学习笔记之Html属性绑定
2018/01/03 Javascript
webpack打包nodejs项目的方法
2018/09/26 NodeJs
d3绘制基本的柱形图的实现代码
2018/12/12 Javascript
详解如何使用webpack打包多页jquery项目
2019/02/01 jQuery
浅谈 Webpack 如何处理图片(开发、打包、优化)
2019/05/15 Javascript
了解JavaScript函数中的默认参数
2019/05/30 Javascript
vue项目初始化到登录login页面的示例
2019/10/31 Javascript
[02:27]刀塔重生降临
2015/10/14 DOTA
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
2016/06/07 Python
Python 基础之字符串string详解及实例
2017/04/01 Python
Python 绘图库 Matplotlib 入门教程
2018/04/19 Python
利用 Python ElementTree 生成 xml的实例
2020/03/06 Python
python爬虫学习笔记之pyquery模块基本用法详解
2020/04/09 Python
Pycharm激活方法及详细教程(详细且实用)
2020/05/12 Python
Python函数参数分类原理详解
2020/05/28 Python
Python+Selenium实现自动化的环境搭建的步骤(图文)
2020/09/01 Python
html2canvas生成清晰的图片实现打印的示例代码
2019/09/30 HTML / CSS
丝芙兰中国官方商城:SEPHORA中国
2018/01/10 全球购物
Brasty罗马尼亚:购买手表、香水、化妆品、珠宝
2020/04/21 全球购物
武汉英思工程科技有限公司–ORACLE面试测试题目
2012/04/30 面试题
产品调价通知函
2015/04/20 职场文书
行政处罚告知书
2015/07/01 职场文书
2016公司新年问候语
2015/11/11 职场文书
redis 限制内存使用大小的实现
2021/05/08 Redis
OpenCV-Python实现图像平滑处理操作
2021/06/08 Python
Ajax 的初步实现(使用vscode+node.js+express框架)
2021/06/18 Javascript