我已经使用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
现在的问题是我的开发人员说他可以为某些查询参数传递一些值,因为他将传递实际值,而对于某些查询参数他将传递“”或“或空值。
嗯,真正简单(正确的答案是,您应该站出来,并请前端工程师构造正确的URL。
我不知道django-filters
的工作原理,但是下面的一些伪代码显示了可以采取的方向:
broker_name = filters.CharFilter(
field_name='broker_name').exclude(
broker_name__exact='""').exclude(
broker_name__exact="''")
或者也许看看overriding the filters。