【问题标题】:How do add non-model fields to DRF's serializer response dict?如何将非模型字段添加到 DRF 的序列化程序响应字典?
【发布时间】:2015-03-12 21:04:06
【问题描述】:
if serializer.is_valid():
    serializer.save()
    return Response(serializer.data, status=status.HTTP_201_CREATED)

如何向 serializer.data dict 添加一个额外的字段(非模型字段)?我想在发送响应之前添加 ("status" : "available")。我试过这个 -

if serializer.is_valid():
    serializer.save()
    ## This one doesn't work as serializer.data is of the type 'ReturnDict' 
    serializer.data.append(("status","available")) 
    ## OR
    serializer.data["status"]  = "available"
    return Response(serializer.data, status=status.HTTP_201_CREATED)

我还想在发送响应之前修改 serializer.data 的字段名称。有没有办法做到这一点?

【问题讨论】:

    标签: python django api serialization django-rest-framework


    【解决方案1】:

    您可以像这样向序列化程序添加一个额外的字段:


    class MySerializer(serializers.ModelSerializer)
        status = serializers.SerializerMethodField('get_status')
    
        class Meta: 
            model = MyModel
            read_only_fields = ('status',)
    
        def get_status(self, obj):
            """ Get the current objects status """
            if obj.available == 1:
                return 'available'
            else:
                return 'not available'
    

    更改字段名称的一种方法是使用中间件类来格式化响应。如果我必须为整个 API 格式化响应,我会这样做。

    【讨论】:

    • 向序列化程序添加状态字段将在创建新对象时产生 POST 问题。我的模型中没有任何名为“状态”的字段,我不想要它。因此,如果我在此处添加状态字段,序列化 POST 请求可能会产生问题。
    • 它不会产生问题,因为您可以将其设置为只读。
    • class Meta:model = MyModelread_only_fields = ('status',)
    • @norbert.mate 您可以编辑您的答案并添加这些详细信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    相关资源
    最近更新 更多