ora*_*ge1 12 python django rest django-filter django-rest-framework
我有一些带有时间戳字段的模型:
models.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"))
Run Code Online (Sandbox Code Playgroud)
然后我使用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')
Run Code Online (Sandbox Code Playgroud)
使用以下设置:
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',),
}
Run Code Online (Sandbox Code Playgroud)
我能够通过event_type和过滤event_model,但是在按时间戳字段过滤时遇到问题.基本上,我想进行一个等同于以下的API调用:
AuditEvent.objects.filter(timestamp__gte='2016-01-02 00:00+0000')
Run Code Online (Sandbox Code Playgroud)
我希望我可以做如下:
response = self.client.get("/api/v1/events/?timestamp=2016-01-02 00:00+0000", **{'HTTP_ACCEPT': 'application/json'})
Run Code Online (Sandbox Code Playgroud)
虽然这是incorect.如何进行API调用以返回时间戳大于或等于某个值的所有对象?
clw*_*ght 11
要扩展Flaiming的答案,如果您只是要通过ISO日期时间格式进行过滤,则有必要覆盖默认值以始终使用IsoDateTimeFilter.这可以通过例如每个滤波器来完成
from django.db import models as django_models
import django_filters
from rest_framework import 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
Run Code Online (Sandbox Code Playgroud)
然后,您不必担心为每个查找表达式和每个字段设置不同的过滤器.
您可以创建具体FilterSet如下:
import django_filters
from rest_framework import filters
from rest_framework import viewsets
class EventFilter(filters.FilterSet):
timestamp_gte = django_filters.DateTimeFilter(name="timestamp", lookup_expr='gte')
class Meta:
model = Event
fields = ['event_type', 'event_model', 'timestamp', 'timestamp_gte']
class EventsView(viewsets.ReadOnlyModelViewSet):
...
filter_class = EventFilter
Run Code Online (Sandbox Code Playgroud)
比您可以筛选 "/api/v1/events/?timestamp_gte=2016-01-02"
编辑:只是为了澄清,此示例使用django-filter库。
| 归档时间: |
|
| 查看次数: |
12794 次 |
| 最近记录: |