在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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。