Python3.6下PeeWee的TimestampField使用疑问及与DateTimeField的区别
问题解答:PeeWee TimestampField的类型转换与字段差异
嘿,这个现象完全是正常的,而且正好戳中了PeeWee设计这两个字段的核心逻辑,我给你拆解清楚:
1. 为什么存Decimal时间戳,取回来是datetime对象?
这是PeeWee TimestampField的默认行为——它本质是一个「带自动类型转换的字段」:
- 存入时:接受Unix时间戳格式的数值(int、float、Decimal都兼容),自动转成数据库对应的时间类型(比如MySQL的TIMESTAMP)或者数值类型(取决于数据库支持)。
- 取出时:自动把数据库的时间值转成Python的
datetime.datetime对象,目的是让你直接用Python的日期时间API做处理(比如格式化、计算时间差),不用自己手动转。
2. TimestampField和DateTimeField的核心区别
你说的「输入方式差异」是其中一点,但还有两个关键区别:
- 存储映射差异:
- DateTimeField通常映射到数据库的
DATETIME类型(比如MySQL中DATETIME支持的时间范围是1000-01-01到9999-12-31); - TimestampField会映射到数据库的
TIMESTAMP类型(MySQL中TIMESTAMP的范围是1970-01-01到2038-01-19,且会自动关联时区)。
- DateTimeField通常映射到数据库的
- 输入兼容性差异:
- DateTimeField优先接受
datetime对象,也支持能被datetime.strptime解析的字符串; - TimestampField只接受数值类型的时间戳(int/float/Decimal),不接受字符串或datetime对象。
- DateTimeField优先接受
而两者输出都是datetime对象,是PeeWee为了统一上层API体验做的设计——不管你用哪种字段存时间,取出来都是相同的对象类型,减少业务代码的适配成本。
3. 如何取回Decimal类型的时间戳?
如果确实需要原始的Decimal时间戳,有两种简单方法:
方法一:自定义字段(推荐,一劳永逸)
继承TimestampField,重写python_value方法,把返回的datetime转成Decimal:
from peewee import TimestampField from decimal import Decimal from datetime import datetime class DecimalTimestampField(TimestampField): def python_value(self, value): # 处理数据库返回的datetime对象 if isinstance(value, datetime): # 转成时间戳字符串再转Decimal,避免浮点精度问题 return Decimal(str(value.timestamp())) # 处理数据库直接返回的数值类型(比如某些数据库存的是bigint) return Decimal(value)
然后在模型里替换成这个自定义字段:
class MyModel(Model): my_timestamp = DecimalTimestampField() # 其他字段...
方法二:查询后手动转换
如果只是个别场景需要,取到对象后手动转换:
from decimal import Decimal obj = MyModel.get(MyModel.id == 1) # 把datetime转成时间戳再转Decimal decimal_timestamp = Decimal(str(obj.my_timestamp.timestamp()))
内容的提问来源于stack exchange,提问作者Silver
相关产品推荐
相关产品推荐

