在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开发之基于thread线程搜索本地文件的方法
Nov 11 Python
Python numpy实现二维数组和一维数组拼接的方法
Jun 05 Python
python实现电脑自动关机
Jun 20 Python
Python学习笔记之列表推导式实例分析
Aug 13 Python
Django 导出项目依赖库到 requirements.txt过程解析
Aug 23 Python
Django 再谈一谈json序列化
Mar 16 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
May 04 Python
Django如何使用redis作为缓存
May 21 Python
学习Python需要哪些工具
Sep 04 Python
Python装饰器的练习题
Nov 23 Python
Python简易开发之制作计算器
Apr 28 Python
Python加密与解密模块hashlib与hmac
Jun 05 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判断变量类型常用方法
2012/04/24 PHP
PHP SPL使用方法和他的威力
2013/11/12 PHP
叫你如何修改Nginx与PHP的文件上传大小限制
2014/09/10 PHP
php构造函数的继承方法
2015/02/09 PHP
PHP仿微信发红包领红包效果
2016/10/30 PHP
javascript 清除输入框中的数据
2009/04/13 Javascript
jQuery 学习6 操纵元素显示效果的函数
2010/02/07 Javascript
Javascript 类与静态类的实现
2010/04/01 Javascript
jQuery + Flex 通过拖拽方式动态改变图片的代码
2011/08/03 Javascript
jQuery结合CSS制作漂亮的select下拉菜单
2015/05/03 Javascript
JavaScript中Number.MAX_VALUE属性的使用方法
2015/06/04 Javascript
基于Jquery插件Uploadify实现实时显示进度条上传图片
2020/03/26 Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
2016/10/27 Javascript
JS实现控制图片显示大小的方法【图片等比例缩放功能】
2017/02/18 Javascript
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
2017/03/23 jQuery
layui分页效果实现代码
2017/05/19 Javascript
使用vue的v-for生成table并给table加上序号的实例代码
2017/10/27 Javascript
express如何使用session与cookie的方法
2018/01/30 Javascript
微信小程序云函数使用mysql数据库过程详解
2019/08/07 Javascript
关于layui 实现点击按钮添加一行(方法渲染创建的table)
2019/09/29 Javascript
Bootstrap实现模态框效果
2019/09/30 Javascript
Vue3 中的数据侦测的实现
2019/10/09 Javascript
[05:14]辉夜杯主赛事第二日 RECAP精彩回顾
2015/12/27 DOTA
[04:48]DOTA2亚洲邀请赛林书豪为VGJ加油
2017/04/01 DOTA
[00:15]TI9观赛名额抽取
2019/07/10 DOTA
[45:18]完美世界DOTA2联赛循环赛 PXG vs IO 第二场 11.06
2020/11/09 DOTA
Python运算符重载用法实例分析
2015/06/01 Python
python进程管理工具supervisor的安装与使用教程
2017/09/05 Python
利用python如何在前程无忧高效投递简历
2019/05/07 Python
Python3标准库之dbm UNIX键-值数据库问题
2020/03/24 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
2020/11/05 Python
世界上最全面的草药补充剂和顶级品牌维生素网站:HerbsPro
2019/01/20 全球购物
体育教育专业毕业生自荐信
2013/11/15 职场文书
法律系毕业生自荐信范文
2014/03/27 职场文书
奥巴马开学演讲稿
2014/05/15 职场文书
挂牌仪式策划方案
2014/05/18 职场文书