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 = []