Я создал API-интерфейс фильтра с несколькими полями, используя Django filter
Мой код фильтра на основе пользовательского класса выглядит следующим образом:
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=
Здесь вы можете видеть, что имя_брокера и имя_страхованного_назначения пустые (я использую Django rest framework)
Но когда мой разработчик нажимает тот же 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 -фильтр фильтрует на основе "" или "" или null в базе данных для WHIC h он ничего не получает, следовательно, пустой
Мой вопрос в том, как справиться с этой ситуацией в djna go -filter или есть ли способ поймать URL-адрес и изменить его на
/di_enquirylog_filter_query/?start_date=2020-08-10&end_date=2020-08-30&broker_name=&insured_name=
тогда примените его к набору запросов
теперь проблема в том, что мой разработчик говорит, что он может передать какое-то значение для некоторых параметров запроса, поскольку он передаст фактическое значение, а для некоторого параметра запроса он передаст либо "", либо '', либо null.