Django:Datediff SQLクエリ?
質問
Djangoで次のSQLに相当することを試みています。
select * from applicant where date_out -date_in> = 1およびdate_out -date_in <= 6
これを生のSQLクエリとして行うことができますが、コードの後半でフィルタリングできるようにしたいので、通常のQuerySetオブジェクトの代わりにRawQuerySetを扱うのはイライラしています。
解決
使用できます extra()
メソッドとaで渡す where
キーワード引数。の値 where
SQLを含むリストである必要があります WHERE
上記のクエリの条項。 PostgreSQL 8.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
実例。
他のヒント
私はジャンゴの問題に出くわしましたネイティブにサポートしていません Datediff
(およびその他のデータベース相当)、および特定のプロジェクトにそのような機能を何度も使用する必要がありました。
さらに読むと、2つの日付から間隔を計算することの実装は、主要なデータベースフレーバー間で大きく異なることが明らかになりました。これがおそらく、Djangoでネイティブの抽象化関数をまだ持っていない理由です。だから私は自分のdjango orm関数を書きました datediff
:
それぞれのデータベースのDocStringsに記述されたデータベースバックエンド間のさまざまな構文が表示されます。 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)
私のコードに関しては本当に非常にダーピーなので、フォークと改善をお勧めします。