DRF:Field和Serializer有什么区别

时间:2019-01-21 10:39:11

标签: django-rest-framework

我们可以将序列化器用作另一个序列化器中的字段。

想知道为什么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。 我很好奇为什么他们分别拥有序列化程序和字段类。

2 个答案:

答案 0 :(得分:0)

我认为:

django rest framwork中,您可以认为Serializer就像一个面具。它涵盖了您的原始数据,并将其更改为所需的任何内容。像格式化json数据一样,或验证输入数据的格式是否正确。

在您的示例中,

content = serializers.CharField(max_length=200)
created = serializers.DateTimeField()

Comment具有2个直接字段类型CharFieldDateTimeField

user = UserSerializer()

Comment的字段类型为UserSerializerSerializer与此不同,django知道您的CommentSerializerUserSerializer有关系。 UserSerializer中定义的所有内容都将在此处用于格式json输出或验证。并定义此nested objects,您的输出json将具有更多数据,例如

'user': {'email': 'foobar', 'username': 'doe'}

如果要使用一个Comment创建user,则必须在UserSerializer中传递所有验证定义。

结论:在此示例中

  • Field class用于直接字段。
  • Serializer class与其他班级的关系

答案 1 :(得分:0)

Serilaizer在DRF中起作用。序列化器可以嵌套,这就是为什么它可以在其他序列化器中用作字段的原因。是的,如果您检查源代码,则BaseSerializerField的子类,因为序列化器只是字段的一种特殊情况。