我有一个名为Container
的模型,其中包含字段received
和name
。我使用django-filter
来过滤这些字段。
过滤后我得到结果:
<list.filters.AdvancedSearchListFilter object at 0x7f68cd698828>
这是我的filter
课程:
class AdvancedSearchListFilter(django_filters.FilterSet):
field-1 = django_filters.DateFromToRangeFilter(label='Received Date Range')
class Meta:
model = Container
fields = ['field-1', 'field-2']
如何获得过滤结果?
答案 0 :(得分:1)
查看documentation,您可以使用f.qs
访问查询集,其中f是您的过滤器对象。
如果要访问视图中的过滤对象,例如,如果要对它们进行分页,则可以执行此操作。他们在
f.qs
。
因此,如果您从过滤器获得结果如下:
result = AdvancedSearchListFilter(query, queryset=queryset)
请注意,此query
必须是dict
,而不是string
:
# 2016-03-02
query = {'received': datetime.date(2016, 3, 2)} # or your own custom date
您可以使用Container
属性
qs
个对象
container_objs = result.qs
我还查看了django-rest-framework
中DjangoFilterBackend
的实现,并且还使用qs
来访问对象:
if filter_class:
return filter_class(request.query_params, queryset=queryset).qs
答案 1 :(得分:1)
您应该像这样创建filter
类的对象:
filter = FilterClass(query)
query
类型为dict
的位置 - 要获取名为file.txt
的所有文件,请将query
设置为{'name': 'file.txt'}
。
您也可以指定queryset
参数,但如果未提供,则会使用模型默认管理器中的所有项目,例如queryset = Container.objects.all()
。
要获取过滤结果,请访问filter.qs
或迭代filter
:
{% for obj in filter %}
{{ obj.field-2 }} - ${{ obj.field-1 }}<br />
{% endfor %}
另外,您没有指定lookup_type
,默认情况下,确切的术语。将lookup_type
添加到filter
类,如下所示:
搜索部分文字:
field-1 = django_filters.CharFilter(lookup_type='icontains')
要在字段-1中获取foo
的所有条目,请将query
设置为{'field-1': 'foo'}
搜索早于以下日期:
field-2 = django_filters.DateFilter(lookup_type='lt')
要获取今天之前收到的所有条目,请将query
设置为{'field-2': datetime.date.today()}
如果您想在range
中搜索日期:
field-1 = django_filters.DateFromToRangeFilter()
要获取日期范围内收到的所有条目,请将query
设置为{'received_0': start_date, 'field-1_1': end_date}
正式文档django-filter
中有更多示例。