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'}
Вернуться на верх