2

Django で次の SQL に相当するものを実行しようとしています。

SELECT * FROM applicant WHERE date_out - date_in >= 1 AND date_out - date_in <= 6

これは RAW sql クエリとして実行できますが、後でコードでフィルターできるようにしたいので、通常の QuerySet オブジェクトではなく RawQuerySet を処理するのが面倒です。

4

2 に答える 2

2

このメソッドを使用して、キーワード引数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これにより、有効なインスタンスが返されます。

于 2010-10-11T04:59:00.767 に答える
2

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)

私のコードに関しては、私は本当にかなりお粗末なので、フォークして改善することをお勧めします。

于 2016-05-05T15:44:27.497 に答える