django filter - 如何获取过滤的对象

时间:2016-03-03 06:11:41

标签: python django django-filter

我有一个名为Container的模型,其中包含字段receivedname。我使用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']

如何获得过滤结果?

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-frameworkDjangoFilterBackend的实现,并且还使用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中有更多示例。