У меня есть сериализатор для моего класса Post
, который имеет атрибут image
и link
.
media
- это FileField
, а link
- это URLField
, который является URL-адресом, куда я делюсь своим постом (на другом сайте).
Я хочу:
Отправить мои данные сообщения (текст и изображение)
Доступ к URL отправленного файла для использования в общем доступе к нему в другом месте.
Обновление значения link
после того, как я его нашел.
Вот что я пробовал:
post = PostCreateSerializer(data=request.data, context={'request': request})
post.is_valid(raise_excpetions=True)
post.save()
media_url = post.data.get('media')
link = find_link_value(media_url)
post.link = link
post.save()
Это вызывает исключение. говорит:
You cannot call `.save()` after accessing `serializer.data`.If you need to access data before committing to the database then inspect 'serializer.validated_data' instead.
Проблема в том, что когда я использую post.validated_data.get('media')
вместо .data
, это не дает мне URL. Он дает мне InMemoryUploadedFile
объект, который, конечно, не имеет пути и URL.
Я подумал, что мог бы использовать атрибут name
объекта InMemoryUploadedFile
для создания URL-адреса (файл фактически сохраняется на диске, и мне интересно, почему это InMemory
!), Но когда имя дублируется, настоящее имя файла на диске и URL отличается от его исходного имени (например, name.jpg
и name_aQySbJu.jpg
), и я не могу использовать его для своих целей.
Вопрос
Как получить доступ к URL-адресу этого загруженного файла, а также позвонить по номеру save()
после того, как я обновил post
?