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']
Вам нужно будет соответствующим образом обновить логику запроса.