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 は通常、日付/時刻を文字列から datetime オブジェクトに変換するために使用されるため、文字列を直接使用しない理由がわかりません。つまり、'date':i['month']

于 2013-07-02T07:26:21.233 に答える