DRF MultiPartParser возвращает значение в виде списка
I am trying to create an API endpoint. Here I am using MultiPart/form-data content-type to cater multiple input types. But I am stuck in MultiPartParser.
Мое объявление функции представления выглядит примерно так:
@api_view(['GET','POST','PUT'])
@parser_classes([MultiPartParser,JSONParser])
def item_view(request):
Парсер MultiPartParser разбирает следующее:
<QueryDict: {'code': ['3'], 'gst_rate': ['5']}> <MultiValueDict: {}>
Что я хочу:
<QueryDict: {'code':3, 'gst_rate':5}> <MultiValueDict: {}>
Как я могу это сделать?
Это не так из-за MultiPartParser. Даже если вы просто используете, например, JSONParser, значение все равно будет списком, потому что параметры запроса основаны на строке, поэтому могут быть дубликаты.
http://127.0.0.1:8000/my_app/some_random_api4/?code=3&gst_rate=5&code=7
Здесь строка запроса имеет вид ?code=3&gst_rate=5&code=7. Мы видим, что для одного и того же поля code есть 2 значения "3" и "7".
Код
print(f"{request.query_params=}")
for param_name in request.query_params.keys():
print(param_name)
print("\t", request.query_params.getlist(param_name))
print("\t", request.query_params.get(param_name))
print(f"\t {request.query_params[param_name]=}")
Выход
request.query_params=<QueryDict: {'code': ['3', '7'], 'gst_rate': ['5']}>
code
request.query_params.getlist(param_name)=['3', '7']
request.query_params.get(param_name)='7'
request.query_params[param_name]='7'
gst_rate
request.query_params.getlist(param_name)=['5']
request.query_params.get(param_name)='5'
request.query_params[param_name]='5'
Здесь мы видим, что QueryDict отражает список кодов "3" и "7", как и операция getlist(), а get() и [] (__getitem__()) получает только одно значение, здесь последнее - "7".
Вместо того, чтобы вручную вызывать get() или [] или items() на QueryDict, мы можем просто использовать dict() (если вы не хотите изменить реализацию, чтобы получить первое значение в списке вместо последнего):
Код
query_params_updated = request.query_params.dict()
print(f"{query_params_updated=}")
Выход
query_params_updated={'code': '7', 'gst_rate': '5'}