Django-filter: IsoDateTimeFilter Probleme Vergleich anders als "exakt"

Erstellt am 14. Sept. 2017  ·  3Kommentare  ·  Quelle: carltongibson/django-filter

Ich habe versucht, die hier beschriebene Filterung zu implementieren: http://django-filter.readthedocs.io/en/develop/ref/filters.html#isodatetimefilter

Während diese Methode funktioniert, wollte ich mehr als nur "exakte" Übereinstimmung, also ersetzte ich:
fields = ['published']
mit:
fields = {'published': ['exact', 'gte', 'lte']}
Dies funktioniert immer noch für die „exakte“ Filterung mit einer IsoDateTime, aber für „gte“ und „lte“ schlägt es fehl, wenn eine IsoDateTime verwendet wird. Es funktioniert, wenn eine DateTime verwendet wird.

Ich verwende im Moment eine Problemumgehung, die mit IsoDateTime funktioniert, indem jede Suche separat angegeben wird:

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')

Hilfreichster Kommentar

Sie können Meta.filter_overrides verwenden, um die für ein Modellfeld verwendete Filterklasse zu ändern.

class BookFilter(django_filters.FilterSet):

    class Meta:
        model = Book
        fields = {'published': ['exact', 'lte', 'gte']}
        filter_overrides = {
            models.DateTimeField: {'filter_class': django_filters.IsoDateTimeFilter},
        }

Alle 3 Kommentare

Hmmm. Meine erste Antwort ist, dies einfach als Einschränkung der fields -Syntax des Wörterbuchs zu akzeptieren. Das explizite Deklarieren von Feldern – Ihr „Workaround“ – ist der kanonische Weg, dies zu tun. Die Wörterbuchsyntax ist nur eine Abkürzung, und es gibt kein Problem damit, Einschränkungen zu haben.

Trotzdem würde ich eine Änderung mit geringem Platzbedarf vornehmen, um dies zu "reparieren" ...

Sie können Meta.filter_overrides verwenden, um die für ein Modellfeld verwendete Filterklasse zu ändern.

class BookFilter(django_filters.FilterSet):

    class Meta:
        model = Book
        fields = {'published': ['exact', 'lte', 'gte']}
        filter_overrides = {
            models.DateTimeField: {'filter_class': django_filters.IsoDateTimeFilter},
        }

@carltongibson Ich bin froh, die Einschränkung zu akzeptieren. Ich habe versucht, nach einer schnellen "Lösung" zu suchen, aber mein Verständnis der inneren Funktionsweise des Codes ist im Moment zu begrenzt :/

@rpkilby Danke, dein Vorschlag funktioniert gut, ich werde das in Zukunft verwenden :)

@carltongibson Möchten Sie diese Einschränkung in den Dokumenten vermerken? Ich freue mich, einen Pull-Request dafür zu stellen, wenn Sie es für angemessen halten.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen