这是我的代码:
for i in report:
reports.append({
'total':i['vends__sum'],
'date':datetime.strptime(i['month'], "%Y-%m-%d %H:%M:%S")
})
这适用于我的OSX开发环境(virtualenv env django 1.5)
但是在我的生产服务器(ubuntu 12.04 virtualenv django 1.5)上,它不适用于此错误:
Django Version: 1.5.1
Exception Type: TypeError
Exception Value:
must be string, not datetime.datetime
Exception Location: /var/www/webapps/cirostats/products/templatetags/product_tags.py in show_main_chart, line 41
第41行
'date':datetime.strptime(i ['month'],“%Y-%m-%d%H:%M:%S”)
我无法弄清楚为什么在一个环境而不是另一个环境中工作?谁在这里错了,开发还是刺激?
Prod : Python 2.7.3
Dev: Python 2.7.1
MORE:
报告的编制方式如下:
truncate_date = connection.ops.date_trunc_sql('month','timestamp')
qs = objects.extra({'month':truncate_date})
report = qs.values('month').annotate(Sum('vends')).order_by('month')
答案 0 :(得分:2)
在您的生产环境中,i['month']
已经一个datetime.datetime
对象:
>>> import datetime
>>> example = u'2013-06-01 00:00:00'
>>> example = datetime.datetime.strptime(example, "%Y-%m-%d %H:%M:%S")
>>> example = datetime.datetime.strptime(example, "%Y-%m-%d %H:%M:%S")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: must be string, not datetime.datetime
因此,要找到生产和开发环境之间的差异,您必须跟踪生成report
的内容并找出一个环境生成字符串的原因,而另一个生成datetime.datetime
个对象。< / p>
如果您在服务器后端使用日期时间操作,请考虑一些SQL服务器支持本机日期时算术,但SQLite(您通常开发的数据库)不。 PostgreSQL将生成datetime
个对象,SQLite生成字符串。
您要么根据数据库设置切换处理日期的方式,要么检测是否已有datetime
对象并跳过解析。
答案 1 :(得分:1)
strptime会产生一个日期时间对象,在您的调试环境中可以打印,您需要将其更改为:
datetime.strptime(i['month'], "%Y-%m-%d %H:%M:%S").format('how you would like to display it')
但是因为strptime通常用于将日期/时间转换为字符串中的datetime对象,所以我不确定为什么你不直接使用字符串。即 '日期':ⅰ[ '月']