Ali*_*Tou 5 django django-models django-serializer django-rest-framework
我有一个Post类的序列化器,它有一个image和一个link属性.
media是FileField和link是一个URLField是一个网址到别的地方我分享我的帖子(在另一个网站.)
我想要:
提交我的帖子数据(文字和图片)
访问提交文件的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()
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.jpg和name_aQySbJu.jpg)我不能将它用于我的目的.
如何才能访问该上传文件的URL,并save()在我更新后调用post?
序列化器的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)