tob*_*fin 11 django-filter django-rest-framework
我使用django-rest-framework带django-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)
指定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)
我今天遇到了类似的情况,似乎开箱即用的django rest framework*支持这个过滤器:
~/your_endpoint/?date__isnull=True
Run Code Online (Sandbox Code Playgroud)
这与等效ORM查询的外观相匹配.如果这很难看,您可以使用docs示例将该查询参数转换为其他内容而不必覆盖get_queryset
运行django-filter==1.0.4和djangorestframework==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过滤“无日期”
如果没有更优雅的方法,这里是我如何解决我的解决方法,但我仍然想知道使用 的解决方案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)
| 归档时间: |
|
| 查看次数: |
6275 次 |
| 最近记录: |