質問

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:

見る: mike-db-tools githubリポジトリ

それぞれのデータベースの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)

私のコードに関しては本当に非常にダーピーなので、フォークと改善をお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top