Skip to main content
 首页 » 编程设计

python之Django-Filter 返回请求对象

2024年08月14日42freeliver54

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

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

filterset_class 在 View 中定义,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) 

过滤器.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 过滤器 documentation建议通过将 django-filter 后端添加到 DEFAULT_FILTER_BACKENDS 来默认使用 django-filter 后端。 是否有一些我缺少的配置或其他东西

请您参考如下方法:

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) 

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