3

開始日と終了日の両方がオプションである日付範囲でクエリセットをフィルター処理したいと考えています。具体的には、

if dt_from:
    results = results.filter(date_modified__gte=dt_from)
if dt_until:
    results = results.filter(date_modified__lte=dt_until)

ここでdt_from、 とdt_untilはそれぞれdatetime.datetimedatetime.date、または のいずれかNoneです。ただし、複数のフィルターをチェーンする動作に関するドキュメントは非常に紛らわしく ( Django で複数の filter() をチェーンする を参照してください。これはバグですか?それらを AND するのではなく、フィルタします)。

上記のコードは私が望むものを達成しますか (つまり、2 つのフィルターの両方)、またはこれを行うべき別の方法はありますか?

4

1 に答える 1

1

この種の問題に対する一般的な解決策があります。すべてのモデルでこのカスタム クエリセットを再利用します

class MyQuerySet(models.QuerySet):

    def filter_if(self, **kwargs):
        new_kwargs = {a: b for (a, b) in kwargs.items() if b}
        return self.filter(new_kwargs)

results.filter_if(date_modified__gte=dt_from, date_modified__lte=dt_until)
于 2017-01-09T09:26:24.563 に答える