【解決編】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 になるので、そっちのほうが良いかも。