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

问题描述 投票:5回答:2

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

media是一个FileFieldlink是一个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()

这引起了例外。说:

 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.jpgname_aQySbJu.jpg),我不能将它用于我的目的。

如何更新我的save()后,如何访问该上传文件的URL,还可以调用post

django django-models django-rest-framework django-serializer
2个回答
1
投票

序列化程序的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()

1
投票
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中。因此,您可以在创建或更新序列化程序的方法中处理您的额外数据。

© www.soinside.com 2019 - 2024. All rights reserved.