Django-filter: Comparação de problemas IsoDateTimeFilter diferente de 'exata'

Criado em 14 set. 2017  ·  3Comentários  ·  Fonte: carltongibson/django-filter

Eu tenho tentado implementar a filtragem descrita aqui: http://django-filter.readthedocs.io/en/develop/ref/filters.html#isodatetimefilter

Embora esse método funcione, eu queria mais do que apenas correspondência 'exata', então substituí:
fields = ['published']
com:
fields = {'published': ['exact', 'gte', 'lte']}
Isso ainda funciona para filtragem 'exata' com um IsoDateTime, mas para 'gte' e 'lte', falha ao usar um IsoDateTime. Funciona ao usar um DateTime.

Estou usando uma solução alternativa no momento que funciona com IsoDateTime especificando cada pesquisa separadamente:

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

Comentários muito úteis

Você pode usar Meta.filter_overrides para alterar a classe de filtro usada para um campo de modelo.

class BookFilter(django_filters.FilterSet):

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

Todos 3 comentários

Hmmm. Minha primeira resposta é apenas aceitar isso como uma limitação da sintaxe do dicionário fields . Declarar campos explicitamente - sua "solução alternativa" - é a maneira canônica de fazer isso. A sintaxe do dicionário é apenas um atalho e não há problema em ter limitações.

Dito isto, eu faria uma mudança com uma pequena pegada para "consertar" isso ...

Você pode usar Meta.filter_overrides para alterar a classe de filtro usada para um campo de modelo.

class BookFilter(django_filters.FilterSet):

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

@carltongibson fico feliz em aceitar a limitação. Tentei procurar uma "correção" rápida, mas minha compreensão do funcionamento interno do código é muito limitada no momento :/

@rpkilby Obrigado, sua sugestão funciona bem, vou usá-la daqui para frente :)

@carltongibson Você gostaria de observar essa limitação nos documentos? Fico feliz em fazer uma solicitação de pull se você achar apropriado.

Esta página foi útil?
0 / 5 - 0 avaliações