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

Ali*_*Tou 5 django django-models django-serializer django-rest-framework

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

mediaFileFieldlink是一个URLField是一个网址到别的地方我分享我的帖子(在另一个网站.)

我想要:

  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()
Run Code Online (Sandbox Code Playgroud)

这引起了例外.说:

 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.
Run Code Online (Sandbox Code Playgroud)

问题是当我使用post.validated_data.get('media')而不是.data,它不会给我的网址.它给了我一个InMemoryUploadedFile对象,当然,没有任何路径和网址.

我以为我可以使用object的name属性InMemoryUploadedFile来创建url(文件实际上保存在磁盘中,我想知道为什么会这样InMemory!)但是当名称重复时,磁盘和url中文件的真实名称与它的原始名称不同(例如,name.jpgname_aQySbJu.jpg)我不能将它用于我的目的.

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

JPG*_*JPG 5

序列化器的save()方法返回相应的实例。所以,你可以用它来获取网址

post = PostCreateSerializer(data=request.data, context={'request': request})
post.is_valid(raise_excpetions=True)
post_instance = post.save()
media_url = post_instance.media.url
link = find_link_value()
post_instance.link = link
post_instance.save()
Run Code Online (Sandbox Code Playgroud)