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