2016-05-12 19 views
4

Ich habe einige Modelle mit einem Zeitstempel-Feld:Django - Wie nach Datum mit Django Rest Framework zu filtern?

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")) 

ich dann Django-Rest-Rahmen mit einem API-Endpunkt für diese Klasse zu erstellen, mit django-Filter eines Bereitstellen Filterfunktion wie folgt:

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') 

mit den folgenden Einstellungen:

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

Ich kann nach event_type und event_model filtern, habe aber Probleme beim Filtern nach dem Feld Zeitstempel. Im Grunde möchte ich einen API-Aufruf machen, die folgend entspricht:

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

, die ich erwarten würde ich tun könnte, wie folgt:

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

aber, dass incorect ist. Wie führe ich einen API-Aufruf, der alle Objekte zurückgibt, deren Zeitstempel größer oder gleich einem bestimmten Wert ist?

Antwort

2

können Sie spezifische FilterSet wie folgt erstellen:

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 

als Sie von "/api/v1/events/?timestamp_gte=2016-01-02"

Filter bearbeiten können: Nur um zu klären, verwendet dieses Beispiel django-filter Bibliothek.

+0

Hm, I bekomme immer noch 0 Antworten, wenn ich 1 bekommen sollte. Ich habe versucht, sowohl 'django_filters.DateTimeFilter' als auch' django_filters.IsoDateTimeFilter' zu verwenden. Irgendeine Idee, warum das der Fall sein könnte? – orange1

5

Um auf Flaimings Antwort zu erweitern, wenn Sie nur über ISO-Datetime-Formate filtern werden, hilft es, die Voreinstellungen zu überschreiben, immer die IsoDateTimeFilter zu verwenden. Dies kann pro Filtersatz mit z.B.

Sie müssen sich dann keine Gedanken darüber machen, einen anderen Filter für jeden Suchausdruck und jedes Feld festzulegen.

1

IsoDateTimeFilter ist sehr wählerisch über das Eingabeformat; Statt:

  • 2016-01-02 00: 00 + 0000

Verwendung:

  • 2016-01-02T00: 00: 00Z
Verwandte Themen