【问题标题】:How can I deserialize a nested representation in Django REST Framework?如何反序列化 Django REST Framework 中的嵌套表示?
【发布时间】:2014-06-16 02:40:19
【问题描述】:

我有一个 Django 模型 (A),我想以一种形式对其进行序列化,然后从另一种形式反序列化。

例如,假设我的模型 (A) 具有通过普通的一对多或更复杂的多对多关系引用其他模型的字段:

class A(models.Model):
    b = models.ForeignKey(B)
    c = models.ManyToManyField(C, through=D)

    my_val = models.IntegerField()

我有一个 ModelSerializer 子类,它使用嵌套的序列化程序来表示 A.b 和 A.c。它看起来像:

class ASerializer(serializers.ModelSerializer):
    b = MyCustomBSerializer()
    c = MyCustomCSerializer(source=c_set, many=True)

    class Meta:
        model = A

这很好用,并且能够为我请求的A() 实例提供一个很好的分层表示。 MyCustomBSerializerMyCustomCSerializer 按预期调用,以提供 bc 关系的良好嵌套表示。

现在,在我看来,这适用于 GET 方法。对于 POST、PUT 和其他 write 方法,我想做的是能够传递 bc 字段的外键 ID,如下所示:

{"b": 12,
 "c": [1, 4, 99],
 "my_val": 200}

我该怎么做?我发现对基于 ForeignKey 的反序列化的每个引用都涉及使用PrimaryKeyRelatedField 作为bc 的序列化器字段类型。然而,这并不理想,因为它只在序列化时提供主键,例如{"b": 12} 而不是 {"b": {"id": 12, "title": "My B title", "author": {"firstname": "Cynthia", "lastname": Dringus"}}, [...]}

所以我的问题是:是否可以以一种格式序列化相关字段,并以另一种格式反序列化它们?

【问题讨论】:

  • 您可以参考doc

标签: json django rest serialization django-rest-framework


【解决方案1】:

如果您编写自己的视图,您可以为不同的方法指定不同的序列化程序。

一个非常基本的例子:

class SnippetDetail(APIView):
    """
    Retrieve, update or delete a snippet instance.
    """

    def get_object(self, pk):
        try:
            return Snippet.objects.get(pk=pk)
        except Snippet.DoesNotExist:
            raise Http404

    def get(self, request, pk, format=None):
        snippet = self.get_object(pk)
        serializer = SnippetSerializerTypeA(snippet)
        return Response(serializer.data)

    def put(self, request, pk, format=None):
        snippet = self.get_object(pk)
        serializer = SnippetSerializerTypeB(snippet, data=request.DATA)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

请注意,我们在每种方法中使用不同类型的序列化程序。

【讨论】:

    猜你喜欢
    • 2017-07-28
    • 2021-11-30
    • 1970-01-01
    • 2018-07-04
    • 2015-08-26
    • 1970-01-01
    • 2017-06-07
    • 2018-06-04
    • 2018-02-17
    相关资源
    最近更新 更多