在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连接MySQL、MongoDB、Redis、memcache等数据库的方法
Nov 15 Python
Python语言的12个基础知识点小结
Jul 10 Python
python制作爬虫爬取京东商品评论教程
Dec 16 Python
Python3解决棋盘覆盖问题的方法示例
Dec 07 Python
对python字典元素的添加与修改方法详解
Jul 06 Python
flask框架实现连接sqlite3数据库的方法分析
Jul 16 Python
python pandas时序处理相关功能详解
Jul 03 Python
详解python中eval函数的作用
Oct 22 Python
基于Python 的语音重采样函数解析
Jul 06 Python
Python 中的Sympy详细使用
Aug 07 Python
python 多态 协议 鸭子类型详解
Nov 27 Python
Python Pandas读取Excel日期数据的异常处理方法
Feb 28 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实现的功能是显示8条基色色带
2006/10/09 PHP
使用PHPMYADMIN操作mysql数据库添加新用户和数据库的方法
2010/04/02 PHP
PHP限制页面只能在微信自带浏览器访问的代码
2014/01/15 PHP
PHP中使用imagick生成PSD文件缩略图教程
2015/01/26 PHP
Joomla使用Apache重写模式的方法
2016/05/04 PHP
ThinkPHP的SAE开发相关注意事项详解
2016/10/09 PHP
php 字符串中是否包含指定字符串的多种方法
2018/04/12 PHP
让mayfish支持mysqli数据库驱动的实现方法
2010/05/22 Javascript
Javascript中判断变量是数组还是对象(array还是object)
2013/08/14 Javascript
最原始的jQuery注册验证方式
2016/10/11 Javascript
Bootstrap中datetimepicker使用小结
2016/12/28 Javascript
MUI  Scroll插件的使用详解
2017/04/13 Javascript
vue.js开发环境搭建教程
2017/05/04 Javascript
JS实现定时任务每隔N秒请求后台setInterval定时和ajax请求问题
2017/10/15 Javascript
讲解vue-router之什么是动态路由
2018/05/28 Javascript
JS数组去重的6种方法完整实例
2018/12/08 Javascript
微信小程序上传多图到服务器并获取返回的路径
2019/05/05 Javascript
jQuery提示框插件SweetAlert用法分析
2019/08/05 jQuery
基于JavaScript获取url参数2种方法
2020/04/17 Javascript
微信小程序学习总结(二)样式、属性、模板操作分析
2020/06/04 Javascript
vue项目,代码提交至码云,iconfont的用法说明
2020/07/30 Javascript
vue设置默认首页的操作
2020/08/12 Javascript
jQuery实现评论模块
2020/08/19 jQuery
仿照Element-ui实现一个简易的$message方法
2020/09/14 Javascript
Vue实现Header渐隐渐现效果的实例代码
2020/11/05 Javascript
[00:34]拔城逐梦,热血永恒!2020(秋)完美世界城市挑战赛报名开启
2020/10/09 DOTA
pygame学习笔记(3):运动速率、时间、事件、文字
2015/04/15 Python
详解django+django-celery+celery的整合实战
2019/03/19 Python
Python3.5面向对象程序设计之类的继承和多态详解
2019/04/24 Python
使用virtualenv创建Python环境及PyQT5环境配置的方法
2019/09/10 Python
HTML5实现多张图片上传功能
2016/03/11 HTML / CSS
美国最大的在线水培用品商店:GrowersHouse.com
2018/08/14 全球购物
Levi’s西班牙官方网站:李维斯,著名的牛仔裤品牌
2020/08/20 全球购物
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
小学生优秀评语
2014/12/29 职场文书
Javascript webpack动态import
2022/04/19 Javascript