django-rest-framework按日期过滤=无

tob*_*fin 11 django-filter django-rest-framework

我使用django-rest-frameworkdjango-filter.我需要检索date属性所在的小部件列表None,但无论我尝试了什么查询,我都会得到空的响应或完整的,未经过滤的响应.

这是我如何定义视图集和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
Run Code Online (Sandbox Code Playgroud)

以下查询会导致空[]响应:

?date=None
?date=0
?date=NULL
?date=False
?date=2012-05-24T11:20:06Z  # a known and correct date
Run Code Online (Sandbox Code Playgroud)

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

?date=
?no_date=True
?no_date=False
?no_date=1
?no_date=0
Run Code Online (Sandbox Code Playgroud)

很感谢任何形式的帮助!我一直无法找到使用日期(或传递任何信息None作为过滤器值)django-filter专门通过django-rest-framework.


如果没有更优雅的方式,这就是我提出的解决方法,但我仍然想知道一个使用的解决方案django-filter,如果存在的话.

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()
Run Code Online (Sandbox Code Playgroud)

Mat*_*mas 8

指定isnull直接在过滤器的name参数作为'date__isnull'似乎是为我工作与Django的REST框架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 = []
Run Code Online (Sandbox Code Playgroud)


Rob*_*nis 6

我今天遇到了类似的情况,似乎开箱即用的django rest framework*支持这个过滤器:

~/your_endpoint/?date__isnull=True
Run Code Online (Sandbox Code Playgroud)

这与等效ORM查询的外观相匹配.如果这很难看,您可以使用docs示例将该查询参数转换为其他内容而不必覆盖get_queryset

  • 我正在使用2.4.3,但我不相信这是一个新事物

  • 你能给我们你的DRF设置吗?和viewset类?它对我不起作用:/ (4认同)

Seb*_*CHA 6

运行django-filter==1.0.4djangorestframework==3.6.3

正确答案不起作用,因为模块路径已更改django-filter(BooleanFilter 移至 django_filters.rest_framework)。

而且__isnull也没有用,我不得不使用lookup_expr:

from django_filters import rest_framework as filters


class WidgetFilter(filters.FilterSet):
    no_date = filters.BooleanFilter(name='date', lookup_expr='isnull')

    class Meta:

        model = Widget
        fields = ( 'date')
Run Code Online (Sandbox Code Playgroud)

https://github.com/carltongibson/django-filter/issues/743得到答案

现在我可以使用http://localhost:8000/widgets/?no_date=True过滤“无日期”


tob*_*fin 5

如果没有更优雅的方法,这里是我如何解决我的解决方法,但我仍然想知道使用 的解决方案django-filter,如果存在的话。

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()
Run Code Online (Sandbox Code Playgroud)