web-dev-qa-db-ja.com

月と日によるDjango日時フィールドのフィルタリングの問題

次のフィルターが月と日レベルで機能しない理由を誰かが私に説明できますか?年によるフィルタリングは機能しているようですが、他の2つは機能していません。

>>> clicks.count()
36
>>> date = clicks[0].created
>>> date.month
2
>>> date.year
2014
>>> date.day
1
>>> clicks.filter(created__month=2)
[]
>>> clicks.filter(created__month=02)
[]
>>> clicks.filter(created__month='02')
[]
>>> clicks.filter(created__month='2')
[]
>>> clicks.filter(created__month=date.month)
[]
>>> clicks.filter(created__day=date.day)
[]

クエリセットを作成して処理する前に、同じ動作が得られることを示すためのクイックアップデート:

>>> clicks = PreviewClick.objects.filter(created__month = 2)
>>> clicks.count()
0
>>> clicks = PreviewClick.objects.filter(created__month = 02)
>>> clicks.count()
0
>>> clicks = PreviewClick.objects.filter(created__month = '02')
>>> clicks.count()
0
>>> clicks = PreviewClick.objects.filter(created__month = '2')
>>> clicks.count()
0

ここに思考の糧があります:

>>> clicks = PreviewClick.objects.all()
>>> counter = 0
>>> for click in clicks:
...      if click.created.month == 2:
...           counter += 1
... 
>>> counter
35
23
zorrotmm

@ Simon Wilder それが機能しない理由を完全に答えてください。DjangoでTZサポートを無効にすることなく実際に解決する方法は次のとおりです。

Djangoドキュメントは 命令 データベースにタイムゾーン定義をインストールするために与えます:

SQLite:install pytz —変換は実際にはPythonで実行されます。

PostgreSQL:要件なし(タイムゾーンを参照)。

Oracle:要件なし(タイムゾーンファイルの選択を参照)。

MySQL:pytzをインストールし、タイムゾーンテーブルに mysql_tzinfo_to_sql

私の場合:mysqlとMac Os、次のコマンドで問題が解決します:

Sudo mysql_tzinfo_to_sql /usr/share/zoneinfo/ | mysql -u root mysql
19
electropoet

私はあなたとまったく同じ行動を見ていました。

1.6と月のクエリセットの documentation を確認すると。彼らは次の段落を追加しました:

「USE_TZがTrueの場合、日時フィールドはフィルタリングの前に現在のタイムゾーンに変換されます。これには、データベースでのタイムゾーン定義が必要です。」

設定の次の行をFalseに変更すると、期待するデータの取得を開始する必要があります。

USE_TZ = False
25
Simon Wilder

構文が正しくありません。そのはず:

Clicks.objects.filter(created__month=2)

(「オブジェクト」マネージャーを省略しました)

2
user590028

上記の問題が発生したため、ここで回答を更新しましたが、どの解決策も機能しませんでした。ほとんどの新しいmysqlインストールにはtz-infoがプリインストールされているため、mysql_tzinfo_to_sqlコマンドは実際には役に立ちません。また、多くの場合、タイムゾーン対応の日時が必要なため、TZ_INFOをFalseに設定することは実際には解決策ではありません。

したがって、私にとってうまくいったのは、tz対応の日時オブジェクトを作成してそれをチェックすることでした。今日のレコードをフィルタリングしたい場合は、次のようにします。

from datetime import datetime
import pytz

today = datetime.now().replace(tzinfo=pytz.UTC).date()   # tz aware datetime object
todays_records = myModel.objects.filter(created__year=today.year, created__month=today.month,created__day=today.day)

お役に立てれば。

0
devdob