私はここで説明されているフィルタリングを実装しようとしています:http: //django-filter.readthedocs.io/en/develop/ref/filters.html#isodatetimefilter
その方法は機能しますが、「正確な」マッチング以上のものが必要だったので、次のように置き換えました。
fields = ['published']
と:
fields = {'published': ['exact', 'gte', 'lte']}
これは、IsoDateTimeを使用した「正確な」フィルタリングでも機能しますが、「gte」および「lte」の場合、IsoDateTimeを使用すると失敗します。 DateTimeを使用する場合に機能します。
現在、各ルックアップを個別に指定することでIsoDateTimeで機能する回避策を使用しています。
published = django_filters.IsoDateTimeFilter(
name='published', lookup_expr='exact')
published_gte = django_filters.IsoDateTimeFilter(
name='published', lookup_expr='gte')
published_lte = django_filters.IsoDateTimeFilter(
name='published', lookup_expr='lte')
うーん。 私の最初の応答は、これを辞書のfields
構文の制限として受け入れることです。 フィールドを明示的に宣言する—「回避策」—はそれを行うための標準的な方法です。 辞書の構文は単なるショートカットであり、制限があることに問題はありません。
そうは言っても、これを「修正」するために、小さなフットプリントで変更を加えます...
Meta.filter_overrides
を使用して、モデルフィールドに使用されるフィルタークラスを変更できます。
class BookFilter(django_filters.FilterSet):
class Meta:
model = Book
fields = {'published': ['exact', 'lte', 'gte']}
filter_overrides = {
models.DateTimeField: {'filter_class': django_filters.IsoDateTimeFilter},
}
@carltongibson制限を受け入れて満足しています。 私は簡単な「修正」を探してみましたが、コードの内部動作についての私の理解は現時点ではあまりにも限られています:/
@rpkilbyありがとう、あなたの提案はうまくいきます、私はそれを今後使用します:)
@carltongibsonドキュメントでこの制限に注意しますか? あなたがそれが適切であると思うならば、私はそれのためにプルリクエストをすることを嬉しく思います。
最も参考になるコメント
Meta.filter_overrides
を使用して、モデルフィールドに使用されるフィルタークラスを変更できます。