gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 18:19:06 25 4
gpt4 key购买 nike

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

模型.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 调用以返回时间戳大于或等于特定值的所有对象?

最佳答案

为了扩展 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

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

关于python - Django - 如何使用 Django Rest Framework 按日期过滤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37183943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com