2011-01-13 11 views
1

日付範囲をチェックするオブジェクトのフィルターを作成する必要があります。今はすべてのオブジェクトをチェックする非常に非効率的なループを実行しています。私はこれをデータベース呼び出しに単純化したいと思います。Django複合クエリ

ロジックには、startendの日付オブジェクトがあります。開始または終了が予定の範囲内にあるかどうかを確認する必要があります。

if (start >= appointment.start && start < appointment.end) || 
    (end > appointment.start && end <= appointment.end) 

私はSQLでこれを行うことができますが、私は、より複雑なクエリのためのDjangoのモデル構造と同様に慣れていませんよ。

答えて

4

あなたが&とOR演算子とrangeフィールドのルックアップタイプ

QオブジェクトのためのQオブジェクトを必要とする:SQL BETWEEN場合はあなたがいない、http://docs.djangoproject.com/en/dev/ref/models/querysets/#range

Entry.objects.filter(Q(start__range=(appointment.start, appointment.end)) | 
    Q(end__range=(appointment.start, appointment.end))) 

http://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects

範囲あなたは常にQオブジェクトの特定の組み合わせを使用して、正確に条件を再現することができます:

Entry.objects.filter((Q(start__gte=appointment.start) & Q(start__lt=appointment.end)) | 
    (Q(end__gt=appointment.start) & Q(end__lte=appointment.end))) 
+0

最初の例を使用すると、どこで 'start_date'と' end_date'を使いますか? –

+0

申し訳ありませんJosh!最初の例はドキュメントからまっすぐでしたが、その後のアップデートで私はあなたの特定の変数を採用しました:私はそれらを削除します –