【问题标题】:Django Rest Framework - serializer fields for only deserializationDjango Rest Framework - 仅用于反序列化的序列化器字段
【发布时间】:2016-02-19 03:48:16
【问题描述】:

我正在编写一个简单的 API,用于使用 Django Rest Framework 加密/解密密文,我想知道我是否可以在仅用于反序列化(即仅用于验证)的序列化程序中定义恶魔。例如,我有一个名为Message 的模型类,并且我有一个允许用户创建Message 对象的视图。当我调用serializer.is_valid() 时,我想检查名为plaintext 的字段是否为空/空,但是当我向用户显示Message 时,我想将plaintext 字段设置为@987654327 @ 而不是直接显示它。换句话说,我希望用户能够发布这样的消息:

{ 
  "plaintext": "blah",
  "key": "tunafish"
}

然后,在验证它之后,我会向用户显示如下内容:

{
  "plaintext": "link/to/plaintext",
  "ciphertext": "link/to/ciphertext",
  "key": "tunafish"
}

是否可以只使用一个序列化程序来做到这一点?

【问题讨论】:

    标签: python json django serialization


    【解决方案1】:

    Django Rest Framework 序列化程序有两个函数,您可以重写它们以对传入和传出字段具有自定义(不同)行为:to_internal_value(来自 dict)和 to_representation(来自您的 django 模型实例)。

    在您的情况下,我会将字段设为 HyperlinkedIdentityField 并在 to_internal_value 中执行您需要做的任何工作,以创建您的实例和 plaintext 实例之间的关系。

    请参阅有关创建自定义字段 api 的文档 - http://www.django-rest-framework.org/topics/3.0-announcement/#changes-to-the-custom-field-api

    或在此处阅读源代码 - https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/serializers.py

    【讨论】:

    • 您是否知道我如何在不进行硬编码的情况下验证字段的长度?例如,如果其中一个字段的 max_length = 10,我如何从序列化程序中验证这一点(或者它将由模型处理)
    • @SimonZhu - 你可以在你的序列化程序中添加一个字段级的validate_field_name 函数:django-rest-framework.org/api-guide/serializers/…(或者你可以在你的to_internal_value 函数中只添加一个raise serializers.ValidationError())。您还可以按照此 SO 答案 - stackoverflow.com/questions/15845116/… 中的概述向您的 Django 模型添加验证器。希望有帮助!
    猜你喜欢
    • 1970-01-01
    • 2020-06-09
    • 2017-07-28
    • 2014-08-08
    • 2013-07-07
    • 2015-12-19
    • 1970-01-01
    • 2018-06-07
    • 2015-07-01
    相关资源
    最近更新 更多