2016-05-12 4 views
4

私はタイムスタンプフィールドを持ついくつかのモデルがあります:Django - 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")) 

私はその後、ジャンゴ・フィルタが提供して、このクラスのAPIエンドポイントを作成するために、ジャンゴ・休息・フレームワークを使用していますがフィルタリング機能は、次のように次の設定で

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でフィルタリングできますが、タイムスタンプフィールドでフィルタリングするのは問題です。それはincorectですが

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

私は次のように私は何ができる期待
AuditEvent.objects.filter(timestamp__gte='2016-01-02 00:00+0000') 

:基本的に、私は次のように相当のAPIコールを作りたいです。特定の値以上のタイムスタンプを持つすべてのオブジェクトを返すAPI呼び出しを作成するにはどうすればよいですか?

答えて

2

次のように、特定の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 

をあなたは"/api/v1/events/?timestamp_gte=2016-01-02"

EDITによってフィルタリングすることができたより:だけ明確にする、この例ではdjango-filterライブラリを使用しています。

+0

うーん、I私は1になっているはずです。私は 'django_filters.DateTimeFilter'と' django_filters.IsoDateTimeFilter'の両方を使ってみました。なぜそれが事実かもしれないという考え? – orange1

5

Flaimingの回答を拡大するには、ISO datetime形式でフィルタリングする必要がある場合は、常に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 

各ルックアップ式と各フィールドに異なるフィルタを設定することを心配する必要はありません。

1

IsoDateTimeFilterは、入力フォーマットについて非常に厄介です。代わりに:

  • 2016年1月2日00:00 + 0000

使用:

  • 2016-01-02T00:00:00Z
関連する問題