きつねたぬきだし

ちょっとしたメモ代わりに。

【解決編】Django の ORM の Date でハマってる

そもそも

そもそも MySQL のクエリのログくらい、見ましょう。

書き忘れていた場合は、以下の行を my.cnf の [mysqld] に記述します。 パスなどはもちろん、各々の環境に合わせてください。

log = /var/log/mysql/mysql-query-history.log

ログを見る

実際に発行されたクエリ

SELECT `sampleapp_bar`.`id`, `sampleapp_bar`.`foo_id` FROM `sampleapp_bar` INNER JOIN `sampleapp_foo` ON (`sampleapp_bar`.`foo_id` = `sampleapp_foo`.`id`) WHERE `sampleapp_foo`.`date` > '2013-01-01' LIMIT 21

QuerySet.query.str() で出力されたクエリ

SELECT `sampleapp_bar`.`id`, `sampleapp_bar`.`foo_id` FROM `sampleapp_bar` INNER JOIN `sampleapp_foo` ON (`sampleapp_bar`.`foo_id` = `sampleapp_foo`.`id`) WHERE `sampleapp_foo`.`date` > 2013-01-01

全然、違いますね。 実際に発行したほうだと、 LIMIT 句までついています。 QuerySet.query.str() が表示するクエリは、あくまで目安でした。 そもそも QuerySet の段階では実行されてない & どの DB にアクセスするかすら決まっていない のだから、 query が返す値が目安にしかならないのは当たり前ですね。

関係ないこと

gt, lt, gte, lte を使うより、 startswith, endswith の方が良さげです。 期間の時も、 range を使うと、 BETWEEN になるので、そっちのほうが良いかも。