背景
为了在不同数据库中的统一,项目中时间用的是BigIntegerField 字段,导致输入输出需要进行转换,简化这过程其实有不同的办法,下面我们用自定义字段的方式来说明一下。
本实例使用Django3.2.8,通过重写Field实现自定义
自定义字段常用方法
1.to_python
该方法是从数据库加载数据转为python对象(输出)
代码如下:
def to_python(self, value):
if not value:
return None
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(value))
2.get_prep_value
该方法是将python对象转为查询值(输入)
代码如下:
from dateutil import parser
def get_prep_value(self, value):
if not value:
return None
if isinstance(value, int) or isinstance(value, float):
return value
return parser.parse(value).timestamp()
dateutil.parser.parse方法可以把一些基本的时间格式统一,不用多说了
3.from_db_value
该方法直接调用to_python方法就行,但不能缺少
使用
class CustomTimeField(models.BigIntegerField):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def from_db_value(self, value, expression, connection):
return self.to_python(value)
def to_python(self, value):
# 如上
def get_prep_value(self, value):
# 如上
class Person(models.Model):
update_time = CustomTimeField(verbose_name="更新时间", null=True)