django - 在 Django Rest Framework 中访问 .data 后更新序列化器中的值

标签 django django-models django-rest-framework django-serializer

我的 Post 类有一个序列化器,它有一个 image 和一个 link 属性。

media 是一个 FileFieldlink 是一个 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 时,它不会给我网址。它给了我一个 InMemoryUploadedFile 对象,当然,它没有任何路径和 url。

我想我可以使用 InMemoryUploadedFile 对象的 name 属性来查找 url(将在 .save() 之后创建的 URL) ),但是当名称重复时,磁盘和url中文件的真实名称与其原始名称不同(例如,name.jpgname_aQySbJu.jpg)并且我无法将其用于我的目的。

问题

如何才能访问该上传文件的 URL,并在更新我的 post 后调用 save()

最佳答案

序列化器的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>

关于django - 在 Django Rest Framework 中访问 .data 后更新序列化器中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52343062/

相关文章:

Django rest 框架 - PUT 请求的身份验证错误

django - Django Tastypie 中 'obj_get' 的正确实现是什么?

python - 在 Django 中过滤超过 0000-00-00 日期的对象

python - 更新实时 Django Web 应用程序的正确方法

python - Django 预填充+附加固定字符串

python - 为 parent 与 child 和 sibling 建立 M2M 关系

django - 如何使用 django orm 进行嵌套 Group By ?

jquery - Django Rest 框架和文件上传

python - Django OAuth 工具包 - 注册用户

python - 自定义仪表板的 Django 历史记录