我们可以将序列化器用作另一个序列化器中的字段。
想知道为什么DRF中有一个Field类和Serializer类吗?
class CommentSerializer(serializers.Serializer):
user = UserSerializer()
content = serializers.CharField(max_length=200)
created = serializers.DateTimeField()
示例序列化器取自文档https://www.django-rest-framework.org/api-guide/serializers/
如您所见,UserSerializer
很像Field
。
我很好奇为什么他们分别拥有序列化程序和字段类。
答案 0 :(得分:0)
我认为:
在django rest framwork
中,您可以认为Serializer
就像一个面具。它涵盖了您的原始数据,并将其更改为所需的任何内容。像格式化json
数据一样,或验证输入数据的格式是否正确。
在您的示例中,
content = serializers.CharField(max_length=200)
created = serializers.DateTimeField()
Comment
具有2个直接字段类型CharField
和DateTimeField
。
user = UserSerializer()
Comment
的字段类型为UserSerializer
。 Serializer
与此不同,django
知道您的CommentSerializer
与UserSerializer
有关系。 UserSerializer
中定义的所有内容都将在此处用于格式json输出或验证。并定义此nested objects
,您的输出json将具有更多数据,例如
'user': {'email': 'foobar', 'username': 'doe'}
如果要使用一个Comment
创建user
,则必须在UserSerializer
中传递所有验证定义。
结论:在此示例中
Field class
用于直接字段。 Serializer class
与其他班级的关系答案 1 :(得分:0)
Serilaizer在DRF中起作用。序列化器可以嵌套,这就是为什么它可以在其他序列化器中用作字段的原因。是的,如果您检查源代码,则BaseSerializer
是Field
的子类,因为序列化器只是字段的一种特殊情况。