【问题标题】:django-filter get querysetdjango-filter 获取查询集
【发布时间】:2018-05-28 09:38:10
【问题描述】:

我正在使用 django-filter v1.1.0 ,django 1.11。我想要一个模型的动态过滤器。我创建了 filters.py ,其中包含模型过滤器的相应配置。 This site 告诉你:

它将生成一个带有搜索字段的 Django 表单以及 返回过滤后的查询集。

这里指的是SomeModelFilter函数。我尝试将lenobjects 函数应用于它的对象,但它返回了

AttributeError: 'SomeModelFilter' object has no attribute 'len'
AttributeError: 'SomeModelFilter' object has no attribute 'objects'

我想获取过滤后的内容。对我来说,它似乎不是一个 QuerySet。

filters.py

from project_app.models import *
import django_filters


class SomeModelFilter(django_filters.FilterSet):
    class Meta:
        model = SomeModel
        fields = ['field_a', 'field_b', 'field_c', 'field_d']

views.py

    somemodel_list = SomeModel.objects.all()
    somemodel_filter = SomeModelFilter(request.GET, queryset=somemodel_list)

    print(len(somemodel_filter)) # This gives the first error
    print(somemodel_filter.objects.all()) # This gives the second error

我想获取过滤后的内容,希望它包含在somemodel_filter 对象中。

【问题讨论】:

  • 你能发布完整的代码吗?
  • @neverwalkaloner,代码的其他部分与问题无关。
  • 看起来在somemodel_filter 初始化后某处出现错误。如果您也可以添加视图和完整的回溯,那就太好了。
  • @neverwalkaloner 添加了打印语句,它会给出错误。我认为这应该足够了。我只想要somemodel_filter的内容

标签: python django django-filter


【解决方案1】:

问题出在print(somemodel_filter.objects.all())这一行。 somemodel_filter 不是模型,它是 filterset 实例,因为它没有 objects 属性。要获得过滤的查询集,请使用qs 属性,如下所示:

print(somemodel_filter.qs)

您可以找到过滤器使用示例here

【讨论】:

  • 如何处理基于外键字段的过滤器?
  • @OmkarDeshpande 与任何其他字段相同,默认情况下您应该传递 id 以通过外键过滤。
【解决方案2】:
filtered_data = ExampleFilter(requet.Get, queryset=Example.objects.all())

获取过滤后的查询集

filtered_queryset_data = filtered_data.qs

使用序列化器对数据进行序列化。使用 many=true 因为它是一个列表

serialized_data = ExampleSerializer(filtered_queryset_data, many=true).data

【讨论】:

    猜你喜欢
    • 2022-01-26
    • 2015-10-17
    • 1970-01-01
    • 2021-12-10
    • 2012-03-02
    • 1970-01-01
    • 2020-10-10
    • 2015-03-20
    • 2021-03-17
    相关资源
    最近更新 更多