Как изменить параметры запроса в фильтре Django? - PullRequest
0 голосов
/ 06 мая 2020

Я создал 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.

1 Ответ

0 голосов
/ 07 мая 2020

Что ж, действительно простой (и правильный) ответ заключается в том, что вы должны проявить инициативу и попросить своего фронтенд-инженера создать правильный URL.

Я не знаю, как работает django-filters , но вот какой-то псевдокод, чтобы показать направление, в котором вы можете двигаться:

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

или, может быть, посмотрите на , переопределив фильтры .

...