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'}