django-rest-framework filter by date = None

django-rest-framework filter by date = None

问题描述:

我正在使用 django-rest-framework django-filter 。我需要检索一个小部件的列表,其中日期属性是,但无论我尝试了什么查询,我收到空的回复或完整的,未过滤的回复。

I am using django-rest-framework with django-filter. I need to retrieve a list of Widgets where the date property is None, but no matter what query I have tried, I am getting either empty responses or full, unfiltered responses.

这是我如何定义视图和过滤器集。

Here's how I have defined the viewset and filterset.

class WidgetFilter(django_filters.FilterSet):
    date = django_filters.DateTimeFilter(name='date', lookup_type='exact')
    no_date = django_filters.DateTimefilter(name='date', lookup_type='isnull')
    class Meta:
        model = Widget
        fields = ['date',]

class WidgetSet(viewsets.ModelViewSet):
    model = Widget
    filter_class = WidgetFilter

以下查询导致空的 [] 回复:

The following queries result in empty [] responses:

?date=None
?date=0
?date=NULL
?date=False
?date=2012-05-24T11:20:06Z  # a known and correct date

以下查询导致返回的所有对象:

The following queries result in all objects being returned:

?date=
?no_date=True
?no_date=False
?no_date=1
?no_date=0

任何帮助非常感谢!我没有找到有关使用日期的信息(或将作为过滤器值)与 django-filter 特别是通过 django-rest-framework

Any help is very much appreciated! I have been unable to find any information on using dates (or passing None as a filter value) with django-filter specifically via django-rest-framework.

如果有不是更优雅的方式,这里是如何打破我的解决方法,但我仍然想知道一个解决方案,使用 django-filter (如果存在)。 p>

In case there is no more elegant way, here is how I bodged my workaround, but I'd still like to know of a solution that uses django-filter, if one exists.

class WidgetSet(viewsets.ModelViewSet):
    model = Widget

    def get_queryset(self):
        if 'no_date' in self.request.QUERY_PARAMS:
            return self.model.objects.filter(date=None)
        return self.model.objects.all()


指定 isnull 直接在过滤器的名称参数中作为'date__isnull'似乎在为Django REST Framework 3.1.3工作。

Specifying isnull directly in the filter's name argument as 'date__isnull' seems to be working for me with Django REST Framework 3.1.3.

class WidgetFilter(django_filters.FilterSet):
    date = django_filters.DateTimeFilter(name='date')
    no_date = django_filters.BooleanFilter(name='date__isnull')
    class Meta:
        model = Widget
        fields = []