Django REST Framework, последствия использования [] в поиске

У меня есть очень простой Django API, который делает запрос в elasticsearch. Вывод показывает параметры запроса и search.query.

Почему я не могу передать переменную страны, в данном случае 'DE', в search.query, как показано в выводе? Не могли бы вы объяснить последствия [] в переменной country[]?

class ESNumView(APIView):
"""Obtain number of articles after a search in titles and abstract in ES"""

def get(self, request, *args, **kwargs):
    query = self.request.query_params.get('query')
    country = self.request.query_params.get('country')

    print(self.request.query_params)

    search = Search(index=constants.ES_INDEX)

    q = Q('bool',
          must=[
            Q('multi_match', query=query, fields=['title', 'abstract']),
            Q('terms', country=country)
          ]
        )
    s = search.query(q)

    pprint(s.to_dict())

    num_count = s.count()

    return Response(data=[{'search_count': num_count}])

Вывод:

 <QueryDict: {'query': ['membrane'], 'country[]': ['DE']}>

 {'query': {'bool': {'must': [{'multi_match': {'fields': ['title',
                                                          'abstract'],
                                               'query': 'membrane'}},
                              {'terms': {'country': None}}]}}}

Имя ключа - country[], вот и все. Поэтому вы получаете доступ к значению с помощью:

country = self.request.query_params.get('country[]')

Таким образом, часть [] не является чем-то особенным: ключ просто завершается символами [ и ].

Причина, по которой это происходит, скорее всего, заключается в том, что HTML-форма имеет мультиселект для значений страны, и в PHP это нужно было сделать, позволив имени заканчиваться на [], чтобы "продвинуть" значения в списке. Но это не так для Django.

Since it however ends with [], it thus likely means that the user is supposed to be able to select mutliple countries. In that case you can use .getlist(…) [Django-doc] to obtain a list of associated values:

countries = self.request.query_params.getlist('country[]')  # ['DE']

Вам нужно будет соответствующим образом обновить логику запроса.

Вернуться на верх