Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 如何在Django REST框架中反序列化嵌套表示?_Json_Django_Rest_Serialization_Django Rest Framework - Fatal编程技术网

Json 如何在Django REST框架中反序列化嵌套表示?

Json 如何在Django REST框架中反序列化嵌套表示?,json,django,rest,serialization,django-rest-framework,Json,Django,Rest,Serialization,Django Rest Framework,我有一个Django模型(a),我想以一种形式序列化它,然后从另一种形式反序列化它 例如,假设我的模型(A)中的字段通过普通的一对多关系或更复杂的多对多关系引用其他模型: class A(models.Model): b = models.ForeignKey(B) c = models.ManyToManyField(C, through=D) my_val = models.IntegerField() 我有一个ModelSerializer子类,它使用嵌套的序列

我有一个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()
实例提供一个很好的层次表示
MyCustomBSerializer
MyCustomCSerializer
按预期调用,以提供
b
c
关系的良好嵌套表示

现在,对于我的视图中的
GET
方法来说,这很好。对于POST、PUT和其他写入方法,我想做的是能够传递
b
c
字段的外键ID,如下所示:

{"b": 12,
 "c": [1, 4, 99],
 "my_val": 200}
我该怎么做?我找到的每个关于基于ForeignKey的反序列化的引用都涉及使用
PrimaryKeyRelatedField
作为
b
c
的序列化器字段类型。然而,这并不理想,因为它只在序列化时提供主键,例如,
{“b”:12}
而不是
{“b”:{“id”:12,“title”:“我的b title”,“author”:{“firstname”:“Cynthia”,“lastname”:“Dringus”},[…]}


所以我的问题是:是否可以将相关字段序列化为一种格式,然后反序列化为另一种格式?

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

一个非常基本的例子:

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)
请注意,我们在每个方法中使用不同类型的序列化程序。

您可以参考。