【问题标题】:Django-Filter returns the request objectDjango-Filter 返回请求对象
【发布时间】:2026-02-13 20:35:01
【问题描述】:

我试图在 DRF 中使用 Django-filters 库动态过滤 Django 中的查询集,但过滤器发送的响应与请求完全相同,即如果我选择模式 = 传输响应是

{
  "data": {
    "mode": "transfer"
  }
}

filterset_class 在视图中定义,queryset 与请求类型一起传递给它。

views.py

from .filters import DataFilter
def get(self, request):

    query_set = ModelName.objects.all()
    queryset_filter = DataFilter(
        request.GET, queryset=query_set)
    return Response({"data": queryset_filter.data}, status=status.HTTP_200_OK)

filters.py

from django_filters import rest_framework as filters
from .models import ModelName
from common.models import MODE_CHOICES


class DataFilter(filters.FilterSet):

    currency = filters.ModelMultipleChoiceFilter(lookup_expr='iexact')
    coin_type = filters.ModelMultipleChoiceFilter(lookup_expr='iexact')
    mode = filters.ModelChoiceFilter(
        lookup_expr='iexact', choices=MODE_CHOICES)
    max_amount = filters.NumberFilter(
        field_name='price', lookup_expr='gt')
    min_amount = filters.NumberFilter(
        field_name='amount', lookup_expr='lt')

    class Meta:
        model = ModelName
        fields = ('currency', 'coin_type', 'mode',
                  'max_amount', 'min_amount')

django-filters documentation 建议默认情况下可以使用 django-filter 后端,方法是将其添加到 DEFAULT_FILTER_BACKENDS。 是否有一些我缺少的配置或其他东西

【问题讨论】:

    标签: python django django-filters


    【解决方案1】:

    filterset.data 属性实际上是您在初始化时提供给DataFilter 的数据/查询参数。在这种情况下,您将提供 request.GET 作为数据。

    你要访问的是filterset的.qs属性,也就是过滤后的结果。例如,

    def get(self, request):
        queryset_filter = DataFilter(request.GET, queryset=ModelName.objects.all())
        return Response({"data": queryset_filter.qs}, status=status.HTTP_200_OK)
    

    请注意,您可能需要序列化过滤后的查询集。

    【讨论】: