【问题标题】:DRF: What's the difference between Field and SerializerDRF:字段和序列化器有什么区别
【发布时间】:2019-06-14 17:39:18
【问题描述】:

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

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

【问题讨论】:

  • 您可以为您的问题添加更多详细信息吗?像任何例子一样。
  • @NgocPham 添加了.. 谢谢!

标签: django-rest-framework


【解决方案1】:

Serilaizer 实际上是 DRF 中的一个字段。序列化器可以嵌套,这就是为什么它可以用作其他序列化器中的字段。是的,如果您查看源代码,BaseSerializerField 的子类,因为序列化程序只是字段的一个特例。

【讨论】:

    【解决方案2】:

    在我看来:

    django rest framwork 中,您可以将Serializer 视为一个面具。它涵盖了您的原始数据并将其更改为您想要的任何内容。比如格式化你的 json 数据,或者验证你的输入数据格式是否正确。

    在你的例子中,

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

    Comment 有 2 个直接字段类型 CharFieldDateTimeField

    user = UserSerializer()
    

    Comment 的字段类型为 UserSerializer。这是不同的Serializer,而django 知道你的CommentSerializer 将与UserSerializer 有关系。 UserSerializer 中定义的任何内容都将在这里使用,用于格式化 json 输出或验证。定义这个nested objects,你的输出json会有更多的数据,比如

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

    如果你想用一个user创建Comment,你必须通过UserSerializer中的所有验证定义。

    结论:在这个例子中

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      相关资源
      最近更新 更多