2013-07-02 2 views
0

Это мой код:Python datetime.strptime работает только на Dev среде

for i in report: 
    reports.append({ 
     'total':i['vends__sum'], 
     'date':datetime.strptime(i['month'], "%Y-%m-%d %H:%M:%S") 
    }) 

Это работает на моей среде Dev OSX (virtualenv окр Джанго 1,5)

Но на моем сервере производства (убунту 12,04 virtualenv Джанго 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")

Я не могу понять, почему работает на одном окружении, а не на другом? Кто здесь не такой, dev или prod?

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

Ну, я: {'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 

Так найти разницу ween в вашей среде разработки и разработки, вам придется отслеживать, что производит report, и выяснить, почему одна среда создает строки, а другая производит datetime.datetime объектов.

Если вы используете операции datetime на сервере, учтите, что некоторые SQL-серверы поддерживают собственную арифметику дат-времени, но SQLite (база данных, которую вы обычно разрабатываете против) не. PostgreSQL будет производить datetime объектов, SQLite производит строки.

Вы либо захотите переключиться, как вы обрабатываете даты здесь, на основе настроек базы данных, либо обнаружите, что у вас уже есть объект datetime и пропустить разбор.

+0

Хорошо, это то, что «i» находится в цикле: datetime.strptime («% s»% i ['month'], "% Y-% m-% d% H:% M:% S") on мой dev env. Хорошо, но то, что вы говорите, имеет смысл, позвольте мне понюхать – Harry

+0

@Harry: Я добавил пример, в котором мы сначала передаем строку, затем результат '.strptime()' to '.strptime()' для воспроизведения ваше исключение. –

+0

Проверьте мое обновление в моем вопросе, как я его создаю, я вижу, что Im фактически создает объект datetime, как бы вы сделали его строкой и оставите мою логику в такте? – Harry

1

результатам strptime в объекте даты и времени, которое, в вашей отладке среды печатаемого для производства вам нужно изменить его на:

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

Но так как вы strptime обычно используются для преобразования даты/времени к datetime из строки Я не уверен, почему вы не просто используете строку напрямую. т.е. 'date': i ['month']

+0

Yup, я решил использовать его напрямую, но это не работает должным образом в dev, но это нормально .. – Harry

+1

Вы всегда можете сделать его условным в зависимости от типа. –

Смежные вопросы