如何在Django过滤器中更改查询参数?

问题描述 投票:-1回答:1

我已经使用Django过滤器创建了多字段过滤器API

我的基于自定义类的过滤器代码如下

from django_filters import rest_framework as filters

class EnquiryLogFilter(filters.FilterSet):

    start_date = filters.DateFilter(field_name='actual_mail_date',lookup_expr='gte')
    end_date = filters.DateFilter(field_name='actual_mail_date',lookup_expr='lte')
    broker_name = filters.CharFilter(field_name='broker_name')
    insured_name = filters.CharFilter(field_name='insured_name')


    class Meta:
        model = EnquiryLog
        fields =['start_date','end_date','broker_name','insured_name']

我的过滤器视图是

class ENQUIRYFILTERVIEWSET(viewsets.ModelViewSet):
    # comment this when using inbuilt get_queryset
    queryset = EnquiryLog.objects.all()
    serializer_class = EnquirySerializer
    filter_backends = (DjangoFilterBackend,OrderingFilter,SearchFilter,)

    filterset_class= EnquiryLogFilter

    ordering =  ('-unique_id_for_mail')
    search_fields = ('country_name')

现在,当我使用各种查询参数在浏览器中调用我的api时,我也得到了结果

/di_enquirylog_filter_query/?start_date=2020-08-10&end_date=2020-08-30&broker_name=Broker-BPL+5&insured_name=

和我的回复

HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

[
    {
        "unique_id_for_mail": "DISOMPO031",
        "actual_mail_date": "2020-08-30",
        "subject_name": "RE: Macquarie - Vedanta Prepay",
        "broker_name": "Broker-BPL 5",
        "is_today_mail": -2,
        "insured_name": "Mac Steel",
        "obligor_name": "ING Prosafe Nautipa",
        "country_name": "UK",
        "limit": "USD 45M",
        "is_enabled": "True"
    }
]

直到现在一切正常,通过将查询参数保留为空白,上述API可以很好地用于单个查询参数或多查询参数

.../di_enquirylog_filter_query/?start_date=2020-08-10&end_date=2020-08-30&broker_name=&insured_name=

在这里您可以看到broker_name和insured_name为空白(我正在使用Django rest框架)

但是当我的开发人员使用相同的api时,他说对于那些用户未提供其值的参数,他会将其设置为null或“”或,并且api将变成这样

/di_enquirylog_filter_query/?start_date=2020-08-10&end_date=2020-08-30&broker_name=""&insured_name="" 

/di_enquirylog_filter_query/?start_date=2020-08-10&end_date=2020-08-30&broker_name=''&insured_name=''

/di_enquirylog_filter_query/?start_date=2020-08-10&end_date=2020-08-30&broker_name=null&insured_name=null

但是在这种情况下,筛选器返回空列表,因为我可以理解Django -filter会基于“”或“或基于db的null进行筛选,因此它什么也没有得到,因此为空白

我的问题是如何在djnago -filter中处理这种情况,或者有什么办法可以捕获URL并将其更改为

/di_enquirylog_filter_query/?start_date=2020-08-10&end_date=2020-08-30&broker_name=&insured_name=

然后将其应用于queryset

现在的问题是我的开发人员说他可以为某些查询参数传递一些值,因为他将传递实际值,而对于某些查询参数他将传递“”或“或空值。

python django django-rest-framework django-filter api-filter
1个回答
0
投票

嗯,真正简单(正确的答案是,您应该站出来,并请前端工程师构造正确的URL。

我不知道django-filters的工作原理,但是下面的一些伪代码显示了可以采取的方向:

broker_name = filters.CharFilter(
    field_name='broker_name').exclude(
    broker_name__exact='""').exclude(
    broker_name__exact="''")

或者也许看看overriding the filters

© www.soinside.com 2019 - 2024. All rights reserved.