在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协程相关概念
Jan 20 Python
代码讲解Python对Windows服务进行监控
Feb 11 Python
Python3中的列表生成式、生成器与迭代器实例详解
Jun 11 Python
python对list中的每个元素进行某种操作的方法
Jun 29 Python
python中pip的安装与使用教程
Aug 10 Python
Python简单获取二维数组行列数的方法示例
Dec 21 Python
20行python代码实现人脸识别
May 05 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
Aug 12 Python
Python hashlib加密模块常用方法解析
Dec 18 Python
python 画图 图例自由定义方式
Apr 17 Python
python调用百度AI接口实现人流量统计
Feb 03 Python
python 批量将中文名转换为拼音
Feb 07 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获取文章上一页与下一页的方法
2014/12/01 PHP
php利用scws实现mysql全文搜索功能的方法
2014/12/25 PHP
Swoole 5将移除自动添加Event::wait()特性详解
2019/07/10 PHP
js几个不错的函数 $$()
2006/10/09 Javascript
extjs grid设置某列背景颜色和字体颜色的方法
2010/09/03 Javascript
javascript常见用法总结
2014/05/22 Javascript
JS数字抽奖游戏实现方法
2015/05/04 Javascript
纯HTML5制作围住神经猫游戏-附源码下载
2015/08/23 Javascript
jquery中checkbox使用方法简单实例演示
2015/11/24 Javascript
Jquery easyui开启行编辑模式增删改操作
2016/01/14 Javascript
BootStrap 轮播插件(carousel)支持左右手势滑动的方法(三种)
2016/07/07 Javascript
javascript 单例模式详解及简单实例
2017/02/14 Javascript
vue实现百度下拉列表交互操作示例
2019/03/12 Javascript
Vue封装全局过滤器Filters的步骤
2020/09/16 Javascript
vue 实现图片懒加载功能
2020/12/31 Vue.js
[01:19:11]Ti4 循环赛第二日 NaVi.us vs iG
2014/07/11 DOTA
详解python基础之while循环及if判断
2017/08/24 Python
python利用正则表达式搜索单词示例代码
2017/09/24 Python
pytorch中tensor的合并与截取方法
2018/07/26 Python
Python分割指定页数的pdf文件方法
2018/10/26 Python
在cmd中查看python的安装路径方法
2019/07/03 Python
windows、linux下打包Python3程序详细方法
2020/03/17 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
2020/06/04 Python
Django启动时找不到mysqlclient问题解决方案
2020/11/11 Python
Flask处理Web表单的实现方法
2021/01/31 Python
详解html5页面 rem 布局适配方法
2018/01/12 HTML / CSS
html5 canvas手势解锁源码分享
2020/01/07 HTML / CSS
CK美国官网:Calvin Klein
2016/08/26 全球购物
美国宠物商店:Wag.com
2016/10/25 全球购物
2014党员民主评议个人总结
2014/09/10 职场文书
国庆横幅标语
2014/10/08 职场文书
贷款收入证明范本
2015/06/12 职场文书
详细总结Python常见的安全问题
2021/05/21 Python
Python爬取英雄联盟MSI直播间弹幕并生成词云图
2021/06/01 Python
python 批量压缩图片的脚本
2021/06/02 Python
IDEA 2022 Translation 未知错误 翻译文档失败
2022/04/24 Java/Android