基础配置
错误描述
程序使用的是3.6解释器,django版本为2.2.2,pycharm版本为2019.3.5,今天遇到的报错为:
OverflowError: Python int too large to convert to C long
这是在在写好序列化类后,向django项目发送get请求报错
错误原因
python报错提示为python的int类型长度超过了C语言的允许范围,因为我用的python解释器是cpy,所以会有这个限制
通过搜索网络资源后,错误原因锁定在如下这行: 错误提示告诉我们python在调用datetime.date()时报错,通过仔细回顾我的项目,发现在写表模型时,只有一个地方定义了DateField()类型 我这里定义的是date类型,为什么会在datetime.date()处报错呢?
我首先去查询了数据库实际存储的数据: 发现存进去是一个个时间戳,仔细研究这些时间戳精确程度是到日的,没有时分秒,放上一个修改为DateTimeField()后存储的时间戳例子: 这说明我们在models.py中写的DateField()确实是以date形式存储的时间戳,但是时间戳中是带有时分秒的信息(0000),所以,猜测是从数据库中取数据解析时除了问题
鉴于我的django项目使用的是自带的sqlite3数据库,从互联网上搜搜,猜测大致原因如下: 1、首先是sqlite3默认使用datetime形式存取数据,所以我们的date形式存储进去就变成了带有时分秒信息的时间戳(默认是00000)。 2、由于我们在models.py中指定了DateField()的类型,所以从数据库取数据时,django就是用了datetime.date()进行解析; 3、sqlite3以datetime形式传值给了datetime.date(),导致传值错误,报错
为了验证我的猜想,我去看了djang部分源码: 在报错的位置我发现了两个函数,分别使用了datetime.date()和datetime()进行格式化,这大体验证了我的猜想,如果我们在models.py中修改为DateTimeField(),那么django就会使用下面的函数进行格式化,也就不会报错了。
解决办法
1、在models.py中将DateField()修改为DateTimeField() 2、使用其他数据库(Mysql) 3、通过修改sqlite3(读取模式)解决【待更新。。。。】
|