Django で次の SQL に相当するものを実行しようとしています。
SELECT * FROM applicant WHERE date_out - date_in >= 1 AND date_out - date_in <= 6
これは RAW sql クエリとして実行できますが、後でコードでフィルターできるようにしたいので、通常の QuerySet オブジェクトではなく RawQuerySet を処理するのが面倒です。
このメソッドを使用して、キーワード引数extra()
を渡すことができます。where
の値は、上記のクエリのSQL句where
を含むリストである必要があります。WHERE
私はこれをPostgresql8.4でテストしましたが、私の場合は次のようになりました。
q = Applicant.objects.extra(where = ["""date_part('day', age(date_out, date_in)) >= 1 and
date_part('day', age(date_out, date_in)) <= 6"""])
QuerySet
これにより、有効なインスタンスが返されます。
Django がネイティブにサポートしていないDatediff
(および他のデータベースに相当するもの) という問題に遭遇し、特定のプロジェクトでそのような関数を何度も使用する必要がありました。
さらに読むと、2 つの日付から間隔を計算する実装は、主要なデータベースのフレーバー間で大きく異なることが明らかになりました。これがおそらく、Django にネイティブの抽象化関数がまだない理由です。だから私は自分のDjango ORM関数を書いたdatediff
:
参照: mike-db-tools Github リポジトリ
それぞれのデータベースの docstring に記述された、データベース バックエンド間のさまざまな構文が表示されます。Datediff は、sqlite、MySQL / MariaDB、PostgreSQL、および Oracle をサポートしています。
使用法 (Django 1.8+):
from db_tools import Datediff
# Define a new dynamic fields to contain the calculated date difference
applicants = Applicant.objects.annotate(
days_range=Datediff('date_out','date_in', interval='days'),
)
# Now you can use this dynamic field in your standard filter query
applicants = applicants.filter(days_range__gte=1, days_range__lte=6)
私のコードに関しては、私は本当にかなりお粗末なので、フォークして改善することをお勧めします。