gpt4 book ai didi

python - 使用嵌套的可写序列化程序上传 django rest 框架文件

转载 作者:太空狗 更新时间:2023-10-29 21:39:52 25 4
gpt4 key购买 nike

class AnnotationSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Annotation


class ImageSerializer(serializers.HyperlinkedModelSerializer):
annotations = AnnotationSerializer(many=True, required=False)

class Meta:
depth = 1
model = Image
exclude = ('owner‘,)

注释具有图像外键属性,因此图像可能具有多个注释。我想通过对图像端点的发布请求(包括此图像的注释列表)来创建带有嵌套注释的图像。将我的数据 json 编码发布到图像端点确实有效,并创建了一个带有适当注释的图像。

但是当我尝试上传实际图像时,我必须使用多部分/表单编码的发布请求而不是 json 来使文件上传成为可能。现在我很难将我的嵌套图像注释列表包含在此请求中。也许我可以将一个 json 编码的字符串放在某个表单字段中,然后在 View 中手动解析它,覆盖 request.DATA,但这看起来真的很难看。

我想知道是否有更好的方法来实现我想要做的事情:)。

最佳答案

我发现解决此问题的最巧妙方法是编写一个自定义解析器来解析传入的多部分请求。我一直在使用 formencode进行实际的解析,但您可以使用任何嵌套的表单数据库。这需要很少的代码:

from rest_framework import parsers
from formencode.variabledecode import variable_decode

class MultipartFormencodeParser(parsers.MultiPartParser):

def parse(self, stream, media_type=None, parser_context=None):
result = super().parse(
stream,
media_type=media_type,
parser_context=parser_context
)
data = variable_decode(result.data)
return parsers.DataAndFiles(data, result.files)

然后在你的 ViewSet

class ImageViewSet(viewsets.ModelViewSet):
...
parsers = (MultipartFormencodeParser,)
...

Formencode 将列表表示为 <key>-<index>编码表单数据和嵌套属性中的条目为 <item>.<proprety> .因此,在您的示例中,客户端需要将注释编码为类似 "annotation-1.name" 的内容。在请求中。显然,您仍然需要在序列化程序中手动处理嵌套数据的更新,如其余框架文档中所述 here

关于python - 使用嵌套的可写序列化程序上传 django rest 框架文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25291466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com