在django中自定义字段Field详解
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_*_
fromdjango.dbimportmodels
importast
classListField(models.TextField):
"""自定义list字段
models.SubfieldBase提供to_python和from_db_value
把数据库数据转化成python数据
现在主要是from_db_value方法把数据库数据转化成python数据
to_python主要是接受form表单
"""
__metacalss__=models.SubfieldBase
description='Storesapythonlist'
def__init__(self,*args,**kwargs):
super(ListField,self).__init__(*args,**kwargs)
#defdb_type(self,connection):
#ifconnection.setting_dict['ENGINE']=='django.db.backends.mysql':
#return'listtype'
deffrom_db_value(self,value,expression,connection,context):
"""数据库数据转成python数据"""
ifvalueisNone:
value=[]
returnvalue
ifisinstance(value,list):
returnvalue
returnast.literal_eval(value)
defto_python(self,value):
"""从数据库中读取的数据转成python
eval(value)读取value原来的类型
ast模块就是帮助Python应用来处理抽象的语法解析的。
而该模块下的literal_eval()函数:
则会判断需要计算的内容计算后是不是合法的python类型,
如果是则进行运算,否则就不进行运算。
"""
ifnotvalue:
value=[]
ifisinstance(value,list):
returnvalue
returnast.literal_eval(value)
defget_prep_value(self,value):
"""
把python数据压缩后保存到数据库
或者说把python对象转化成查询值
返回值是个字符串
:paramvalue:
:return:
"""
ifvalueisNone:
returnvalue
returnstr(value)
#defget_db_prep_value(self,value,connection,prepared=False):
#"""把查询集数据转化成数据库值一般不需要重写只需要覆盖"""
#value=super(ListField,self).get_db_prep_value()
#ifvalueisnotNone:
#returnconnection.Database.Binary(value)
#returnvalue
#
defget_prep_lookup(self,lookup_type,value):
"""限制查询方式"""
iflookup_type=='exact':
returnvalue
eliflookup_type=='in':
return[self.get_prep_value(v)forvinvalue]
else:
returnTypeError('lookuptype%rnotsupported'%lookup_type)
defvalue_to_string(self,obj):
"""转换字段数据以进行序列化
Field._get_val_from_obj(obj)是获取值序列化的最佳方式
"""
value=self._get_val_from_obj(obj)
returnself.get_db_prep_value(value)
以上这篇在django中自定义字段Field详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。