Обновление значения в сериализаторе после доступа к .data в Django Rest Framework - PullRequest
0 голосов
/ 15 сентября 2018

У меня есть сериализатор для моего класса Post, который имеет атрибут image и link.

media - это FileField, а link - это URLField, который является URL-адресом, куда я делюсь своим постом (на другом сайте).

Я хочу:

  1. Отправить мои данные сообщения (текст и изображение)

  2. Доступ к URL отправленного файла для использования в общем доступе к нему в другом месте.

  3. Обновление значения 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?

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Метод сериализатора save() возвращает соответствующий экземпляр.Таким образом, вы можете использовать это, чтобы получить URL

post = PostCreateSerializer(data=request.data, context={'request': request})
post.is_valid(raise_excpetions=True)
<b>post_instance = post.save()
media_url = post_instance.media.url</b>
link = find_link_value()
<b>post_instance.link = link
post_instance.save()</b>
0 голосов
/ 15 сентября 2018
post = PostCreateSerializer(data=request.data, context={'request': request})
post.is_valid(raise_excpetions=True)
media_url = post.validated_data.get('media')
link = find_link_value()
post.save(link=link)

На самом деле, вы можете использовать этот подход, чтобы сохранить свой пост.Когда вы передаете ссылку через метод serializer_obj.save (** kwargs), она автоматически передает ваши дополнительные данные в create (self, validated_data) или update (self, instance, validated_data), добавляя ваши дополнительные данные в validatad_data в качестве словаря.Так что вы можете обрабатывать ваши дополнительные данные в методе создания или обновления сериализатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...