2013-07-02 83 views
0

这是我的代码:Python的datetime.strptime只适用于开发环境

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') 
+0

嗯,我是这样的:{'vends__sum':328,'month':u'2013-06-01 00:00:00'} – Harry

+1

没有生产,不是这样。 –

回答

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会产生字符串。

您要么根据数据库设置切换如何处理日期,要么检测您是否已有对象并跳过解析。在日期时间对象,它是在你的调试环境打印,生产

+0

好吧,这就是“我”在循环中:datetime.strptime(“%s”%i ['month'],“%y-%m-%d%H:%M:%S”)on我的开发环境。好吧,但你说的话有道理,让我嗅探 – Harry

+0

@Harry:我已经添加了一个例子,我们先传递一个字符串,然后将'.strptime()'的结果传递给'.strptime()'来重现你的例外。 –

+0

在我的问题中检查我的更新如何创建它,我看到我实际上创建一个日期时间对象,你会如何使它成为一个字符串,仍然保持我的逻辑机智? – Harry

1

strptime的结果,你需要将其更改为:

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

但既然你strptime通常用于日期/时间转换为日期时间对象从字符串我不知道为什么你不只是直接使用字符串。即 'date':i ['month']

+0

是的,我直接使用它,但这不符合预期的开发,但多数民众赞成在.. – Harry

+1

你可以随时使它有条件的基础上的类型。 –