在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中条件选择和循环语句使用方法介绍
Mar 13 Python
用smtplib和email封装python发送邮件模块类分享
Feb 17 Python
简单介绍Python中的filter和lambda函数的使用
Apr 07 Python
Python应用库大全总结
May 30 Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
Jul 04 Python
对Python Pexpect 模块的使用说明详解
Feb 14 Python
Django中信号signals的简单使用方法
Jul 04 Python
pd.DataFrame统计各列数值多少的实例
Dec 05 Python
Tensorflow 模型转换 .pb convert to .lite实例
Feb 12 Python
python deque模块简单使用代码实例
Mar 12 Python
Django多层嵌套ManyToMany字段ORM操作详解
May 19 Python
如何用python反转图片,视频
Apr 24 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/02/27 PHP
thinkPHP实现的联动菜单功能详解
2017/05/05 PHP
ASP.NET jQuery 实例9  通过控件hyperlink实现返回顶部效果
2012/02/03 Javascript
计算新浪Weibo消息长度(还可以输入119字)
2013/07/02 Javascript
jQuery实现个性翻牌效果导航菜单的方法
2015/03/09 Javascript
JQuery分屏指示器图片轮换效果实例
2015/05/21 Javascript
基于jquery实现最简单的选项卡切换效果
2016/05/08 Javascript
js基本算法:冒泡排序,二分查找的简单实例
2016/10/08 Javascript
JS命令模式例子之菜单程序
2016/10/10 Javascript
基于JavaScript实现报警器提示音效果
2017/10/27 Javascript
Vue如何实现响应式系统
2018/07/11 Javascript
详解a标签添加onclick事件的几种方式
2019/03/29 Javascript
vue响应式系统之observe、watcher、dep的源码解析
2019/04/09 Javascript
基于Element的组件改造的树形选择器(树形下拉框)
2020/02/27 Javascript
js实现点击烟花特效
2020/10/14 Javascript
vue实现前端列表多条件筛选
2020/10/26 Javascript
pygame学习笔记(5):游戏精灵
2015/04/15 Python
python实现的守护进程(Daemon)用法实例
2015/06/02 Python
详解python算法之冒泡排序
2019/03/05 Python
python自动化工具之pywinauto实例详解
2019/08/26 Python
python实现淘宝购物系统
2019/10/25 Python
python中的RSA加密与解密实例解析
2019/11/18 Python
Pycharm中import torch报错的快速解决方法
2020/03/05 Python
Python reversed函数及使用方法解析
2020/03/17 Python
python实现批量转换图片为黑白
2020/06/16 Python
Django创建一个后台的基本步骤记录
2020/10/02 Python
微信html5页面调用第三方位置导航的示例
2018/03/14 HTML / CSS
加拿大女装网上购物:Reitmans
2016/10/20 全球购物
数控专业个人求职信范文
2014/02/05 职场文书
安全协议书
2014/04/23 职场文书
国贸专业求职信
2014/06/28 职场文书
公司总经理岗位职责范本
2014/08/15 职场文书
2014年学生管理工作总结
2014/12/20 职场文书
七年级上册语文教学计划
2015/01/22 职场文书
未中标通知书
2015/04/17 职场文书
vue elementUI批量上传文件
2022/04/26 Vue.js