【问题标题】:Rename field in Serializer.data重命名 Serializer.data 中的字段
【发布时间】:2020-06-17 14:15:27
【问题描述】:

我目前正在实现一个 API 客户端,我想验证使用序列化程序发送的请求。 为此,我创建了这样的序列化程序:

class TransactionRequestSerializer(serializers.Serializer):
    counterparty = serializers.UUIDField(required=False)
    from_datetime = serializers.DateTimeField(required=False, source='from')
    to_datetime = serializers.DateTimeField(required=False, source='to')
    transaction_type = serializers.CharField(required=False, source='type')

问题是源不适合我的用法,因为当我执行 serializer.data 时,我得到:

{'from_datetime': '2020-07-07T16:08:00.313236+02:00'}

代替

{'from': '2020-07-07T16:08:00.313236+02:00'}

然后将这些数据作为我的请求的参数传递,例如 requests.get('', params=params)

当然,我不能将字段命名为“来自”,因为它是保留的。关于如何从我的 serializer.data 中获取“来自”的任何想法?

【问题讨论】:

标签: django-rest-framework


【解决方案1】:

我想这已经被回答了。

请看这个问题:How to change field name in Django REST Framework

我认为同样的解决方案也适合你。

【讨论】:

  • 据我所知,我尝试做与此答案中提到的相反的事情。我的字段应在 .data 中以“from”结尾命名。 source 属性会做相反的事情:从 dict 中读取“from”并将 field_name 放入 .data,但正如您所见,field_name 不能是“from”。或者也许我在答案中遗漏了什么?
  • 我认为第二个示例 (alternate_name) 正是您所需要的。
  • 在示例中,alternate_name 将更改为 location 对吗?运行解决方案时,最后我调用 serializer.data 时,我检索 {'locations': OrderedDict([('test', 'A')])}。我想做完全相反的事情:我想以 {'alternate_name': ...} 为例,或者在我的情况下: {'to': '...'}
  • 为了更清楚,在示例中,field_name = xxxxx(*args, **kwargs) 并且在serializer.data 中,出现了field_name。我尝试做的是 old_name = xxxx(*args, **kwargs) 而在 serializer.data 中,出现了“to”。这是序列化器的反向使用。我使用了很多 source='' 或 SerializerMethodField,但这些都是相反的方式。
【解决方案2】:

我认为这是不可能的,所以我改用 Serializer.validated_data 以便我可以使用源代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-06
    • 2014-09-10
    • 2023-03-14
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多