我有一个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和其他 write 方法,我想做的是能够传递b
和c
字段的外键ID,类似这样的:
{"b": 12,
"c": [1, 4, 99],
"my_val": 200}
我该怎么做?我发现基于ForeignKey的反序列化的每个引用都涉及使用PrimaryKeyRelatedField
作为b
和c
的序列化器字段类型。然而,这并不理想,因为它仅在序列化时提供主键,例如, {"b": 12}
而不是{"b": {"id": 12, "title": "My B title", "author": {"firstname": "Cynthia", "lastname": Dringus"}}, [...]}
所以我的问题是:是否可以以一种格式序列化相关字段,并在另一种格式中反序列化它们?
答案 0 :(得分:0)
如果您编写自己的视图,则可以为不同的方法指定不同的序列化程序。
一个非常基本的例子:
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)
请注意,我们在每种方法中使用不同类型的序列化程序。