Django - Почему Django устанавливает `request.data` в класс QueryDict, когда прикреплен файл, но dict, когда файл не прикреплен?

У меня есть тест, в котором я не прикрепляю файл к запросу

>>>request.data
{'description': 'Some Goal text', 'end_date': '2021-12-04', 'goal_category': 'health', 'body': 'Some text #blah\r#weeeee\x0c#foo', 'creator': '6badb4b8-33ba-4bb9-aa9a-2e3afb359960', 'type': <PostType.DECLARE: 'DE'>}
>>>type(request.data)
<class 'dict'>

>>> обозначает место, которое я ввожу в отладочную консоль, а ниже - то, что выводится. Затем я прикрепляю файл и посылаю запрос, и получаю следующее.

>>>type(request.data)
<class 'django.http.request.QueryDict'>
>>>request.data
<QueryDict: {'join_goal': ['d2f5aa8d-4cd0-4051-9d1a-35b28af276d5'], 'body': ['Some text and an image'], 'images': [<InMemoryUploadedFile: test.jpg (text/plain)>], 'creator': ['6badb4b8-33ba-4bb9-aa9a-2e3afb359960'], 'type': [<PostType.UPDATE: 'UP'>]}>

Почему Django использует QueryDict, когда приходит изображение?

Запрашиваемый добавленный код

def set_request_data_for_post(request):
    request.data['creator'] = str(request.user.uuid)
    body_text = request.data['body']
    hash_tags = create_hashtags_uuid_list(body_text)

    if len(hash_tags) > 0:
        request.data.setlist('hash_tags', hash_tags)

    tagged_users_list = extract_usernames(body_text)

    tagged_users = list()
    for username in tagged_users_list:
        try:
            tagged_users.append(str(User.objects.get(username=username).uuid))
        except User.DoesNotExist:
            pass

    if len(tagged_users) > 0:
        request.data.setlist('tagged_users', tagged_users)

    return request

Этот новый request var передается в сериализатор.

Когда DRF получает запрос, он выбирает соответствующий парсер из тех, которые определены в представлении или из defaults

Спарсеры по умолчанию включают JSONParser, который используется при получении данных JSON и возвращает dict и MultiPartParser, который используется при получении данных multipart (тип содержимого, используемый при загрузке файлов) и возвращает QueryDict

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