Django-filter: 'exact'以外のIsoDateTimeFilter問題の比較

作成日 2017年09月14日  ·  3コメント  ·  ソース: carltongibson/django-filter

私はここで説明されているフィルタリングを実装しようとしています: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')

最も参考になるコメント

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},
        }

全てのコメント3件

うーん。 私の最初の応答は、これを辞書の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ドキュメントでこの制限に注意しますか? あなたがそれが適切であると思うならば、私はそれのためにプルリクエストをすることを嬉しく思います。

このページは役に立ちましたか?
0 / 5 - 0 評価