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')
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.
Comentários muito úteis
Você pode usar
Meta.filter_overrides
para alterar a classe de filtro usada para um campo de modelo.