我有一个带时间戳字段的模型:
模型.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框架为这个类创建一个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_type
和event_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调用以返回时间戳大于或等于某个值的所有对象?
您可以按如下方式创建特定的^{} :
你就不能通过
"/api/v1/events/?timestamp_gte=2016-01-02"
过滤编辑:为了澄清,本例使用django-filter库。
IsoDateTimeFilter
对输入格式非常挑剔;而不是:使用:
为了进一步说明Flaiming的答案,如果您只打算通过ISO datetime格式进行筛选,那么覆盖默认值以始终使用
IsoDateTimeFilter
会有帮助。这可以通过每个过滤器集来完成,例如这样就不必为每个查找表达式和每个字段设置不同的筛选器。
相关问题 更多 >
编程相关推荐