Django - 如何使用 Django Rest Framework 按日期过滤?

新手上路,请多包涵

我有一些带有时间戳字段的模型:

模型.py

 class Event(models.Model):
    event_type = models.CharField(
        max_length=100,
        choices=EVENT_TYPE_CHOICES,
        verbose_name=_("Event Type")
    )
    event_model = models.CharField(
        max_length=100,
        choices=EVENT_MODEL_CHOICES,
        verbose_name=_("Event Model")
    )
    timestamp = models.DateTimeField(auto_now=True, verbose_name=_("Timestamp"))

然后我使用 Django-rest-framework 为此类创建 API 端点,django-filter 提供如下过滤功能:

 from .models import Event
from .serializers import EventSerializer
from rest_framework import viewsets, filters
from rest_framework import renderers
from rest_framework_csv import renderers as csv_renderers

class EventsView(viewsets.ReadOnlyModelViewSet):
    """
    A read only view that returns all audit events in JSON or CSV.
    """
    queryset = Event.objects.all()
    renderer_classes = (csv_renderers.CSVRenderer, renderers.JSONRenderer)
    serializer_class = EventSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    filter_fields = ('event_type', 'event_model', 'timestamp')

使用以下设置:

 REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',),
}

我可以通过 event_typeevent_model 进行过滤,但无法通过时间戳字段进行过滤。本质上,我想进行等同于以下内容的 API 调用:

 AuditEvent.objects.filter(timestamp__gte='2016-01-02 00:00+0000')

我希望我可以这样做:

 response = self.client.get("/api/v1/events/?timestamp=2016-01-02 00:00+0000", **{'HTTP_ACCEPT': 'application/json'})

虽然那是不正确的。如何进行 API 调用以返回时间戳大于或等于特定值的所有对象?

原文由 orange1 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 653
1 个回答

为了扩展 Flaiming 的答案,如果您只打算通过 ISO 日期时间格式进行过滤,那么覆盖默认值以始终使用 IsoDateTimeFilter 会有所帮助。这可以通过每个过滤器集完成,例如

import django_filters
from django.db import models as django_models
from django_filters import rest_framework as filters
from rest_framework import viewsets

class EventFilter(filters.FilterSet):
    class Meta:
        model = Event
        fields = {
            'timestamp': ('lte', 'gte')
        }

    filter_overrides = {
        django_models.DateTimeField: {
            'filter_class': django_filters.IsoDateTimeFilter
        },
    }

class EventsView(viewsets.ReadOnlyModelViewSet):
    ...
    filter_class = EventFilter

然后您就不必担心为每个查找表达式和每个字段设置不同的过滤器。

原文由 clwainwright 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题