我有一个Post
类的序列化器,它有一个image
和一个link
属性。
media
是一个FileField
和link
是一个URLField
,这是一个网址到其他地方我分享我的帖子(在另一个网站。)
我想要:
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
对象,当然,没有任何路径和网址。
我以为我可以使用name
对象的InMemoryUploadedFile
属性来创建url(文件实际上保存在磁盘中,我想知道为什么这是InMemory
!)但是当名称重复时,磁盘和url中文件的真实名称与它的不同之处原始名称(例如,name.jpg
和name_aQySbJu.jpg
),我不能将它用于我的目的。
如何更新我的save()
后,如何访问该上传文件的URL,还可以调用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()
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中。因此,您可以在创建或更新序列化程序的方法中处理您的额外数据。