0

这是我的代码:

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

更多的:

报告是这样生成的:

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')
4

2 回答 2

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对象。

如果您在服务器后端使用日期时间操作,请考虑到某些 SQL 服务器支持本机日期时间算法,但 SQLite(您通常开发的数据库)支持。PostgreSQL 将产生datetime对象,SQLite 产生字符串。

您要么希望根据数据库设置在此处切换处理日期的方式,要么检测您是否已经拥有一个datetime对象并跳过解析。

于 2013-07-02T07:21:09.827 回答
1

strptime 生成一个 datetime 对象,在您的调试环境中可打印,对于生产,您需要将其更改为:

datetime.strptime(i['month'], "%Y-%m-%d %H:%M:%S").format('how you would like to display it')

但是由于您通常使用 strptime 将日期/时间从字符串转换为日期时间对象,因此我不确定您为什么不直接使用字符串。即'日期':i ['月份']

于 2013-07-02T07:26:21.233 回答