【问题标题】:django filter - how to get filtered objectsdjango filter - 如何获取过滤后的对象
【发布时间】:2016-03-03 06:11:40
【问题描述】:

我有一个名为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']

如何获得过滤后的结果?

【问题讨论】:

    标签: python django django-filter


    【解决方案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
    

    您可以使用qs 属性从结果中访问Container 对象:

    container_objs = result.qs
    

    我还查看了django-rest-frameworkDjangoFilterBackend 的实现,他们还使用qs 访问对象:

        if filter_class:
            return filter_class(request.query_params, queryset=queryset).qs
    

    【讨论】:

    • file_objs = result.qs 给我一个错误,例如:AttributeError: 'str' object has no attribute 'get' 注意:我使用的是 python 3.4 和 Django 1.9 版本。
    • 你能说明你是如何创建AdvancedSearchInboxFilter的对象的吗?
    • 看更新答案。您在查询中传递了string,但它应该是dict
    • 哦,是的,知道了...非常感谢。
    • @SnehaShinde:从概念的角度来看,您所做的更改是微不足道的(只是对象或类的名称)。您在问题和答案中都这样做了。如果有人阅读上一个问题和答案,他们将与现在有相同的理解。虽然我已批准您的修改,但我认为这种做法不会受到社区的欢迎。
    【解决方案2】:

    您应该像这样创建filter 类的对象:

    filter = FilterClass(query)
    

    其中querydict 类型,例如,要获取所有名为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中有更多示例。

    【讨论】:

    • @SnehaShinde 如果您想从过滤器对象中获取结果,您需要访问qs 属性。看看我昨天发布的答案。
    • @AKS:我试过了:advanced_filters = AdvancedSearchInboxFilter('2016-03-02', queryset=File.objects.all()) 它返回:advanced_filters:。然后 file_objs=advanced_filters.qs 它给了我一个错误: AttributeError: 'str' object has no attribute 'get'
    • @SnehaShinde 请再次阅读我的回复,看起来您并没有完全理解它。您应该像这样AdvancedSearchInboxFilter({'received_0': start_date, 'received_1': end_date}) 启动您的过滤器类。
    • @Forge:是的……现在我可以得到过滤对象的列表。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 2021-07-31
    • 2019-11-19
    • 1970-01-01
    • 2015-03-24
    • 2013-05-08
    相关资源
    最近更新 更多