2017-09-05 9 views
0

私はdjangoプロジェクトにはpostgresを使用し、dbには複雑なクエリではconnection.cursor()を使用します。今日私は、フィルタでdatetimeと未処理のSQLクエリに問題があります:Django raw sql with datetime

結果として私たちは空のリストを持っています。しかし、私はpsqlコンソールからこれを照会すると、結果は空ではないことがわかります:

SELECT * FROM orders_orderstatus WHERE datetime > '2017-09-05 16:07:16'; 

id |  status  |   datetime    
----+--------------------+-------------------------------+ 
256 | created | 2017-09-05 16:10:59.602091+07 
257 | delivered | 2017-09-05 16:11:00.834547+07 
258 | created | 2017-09-05 16:11:03.499364+07 

なぜdjangoはこの結果を受け取っていませんか?

+0

トリッキーなことができ、DjangoのORMをバイパスする:あなたが設定を持っているよう

が見えます。多くの場合、 'QuerySet'をビルドする方が良いです。そのような方法で簡単に上記のクエリを実行することができます。 – Chris

+0

いずれの場合でも、[PostgreSQLへの2つの接続で異なるデータが表示されることがあります](https://www.postgresql.org/docs/current/static/mvcc-intro.html)。これは[機能](https://en.wikipedia.org/wiki/Multiversion_concurrency_control)です。手動クエリでトランザクションを使用していますか?それ以上の情報がなければ、ここで起こっていることを知るのは難しいです。 – Chris

答えて

1

これは、pythonとpsqlがdatetimeの文字列tzinfoを解釈する方法を示しています。

psql(文字列時間をUTCとして使用)

with connection.cursor() as cursor: 

    cursor.execute(
     "SELECT * from orders_orderstatus WHERE datetime > '2017-09-05 09:07:16'" 
    ) 
    row = [item[0] for item in cursor.fetchall()] 
return row 

将来的にはTZでDateTimeオブジェクトを使用しよう:あなたのTZ 07は非常にPythonでしよう Pythonは+ hours_of_your_time_zone

でDBに送信します。

USE_TZ=True