将附加数据添加到 django rest 框架视图集响应

Adding additional data to django rest framework viewset response

目前我有一个示例仓库的视图集,我想将额外的 'filter' 列表传递给每个返回的字典。

我的 WarehouseViewSet:

class WarehouseViewSet(viewsets.ReadOnlyModelViewSet):
    filters = [{'date': 'Date/Time'}]

    queryset = Warehouse.objects.all()
    serializer_class = WarehouseSerializer

WarehouseSerializer:

class WarehouseSerializer(serializers.ModelSerializer):

    class Meta:
        model = Warehouse
        field = ('name', 'address', 'action_list')

目前我得到一个 json 列表响应,例如:

[
    {
        "id": 1, 
        "name": "Brameda Warehouse", 
        "address": "Bergijk"
    }, 
    {
        "id": 2, 
        "name": "Amazon", 
        "address": "UK"
    }
]

我想得到:

[
    {
        "id": 1, 
        "name": "Brameda Warehouse", 
        "address": "Bergijk"
        "filters": [
                    {'date': 'dateTime'}, {'actove': 'ActiveObject'}
                   ]
    }, 
    {
        "id": 2, 
        "name": "Amazon", 
        "address": "UK",
        "filters": [
                    {'date': 'dateTime'}, {'actove': 'ActiveObject'}
                   ]
    }
]

我知道在对象字典之外有一个过滤器就足够了,但我想知道如何在对象内部传递列表。

任何关于如何传递将作为 json 对象返回的附加列表的想法都会受到赞赏。

我有点不清楚你想要什么,但如果你只想向输出添加一些只读计算字段,你可以使用 SerializerMethodField:

class WarehouseSerializer(serializers.ModelSerializer):
    # your other declared fields here
    filters = serializers.SerializerMethodField()

    # your Meta options here

    def get_filters(self, obj):
        return ['some', 'stuff', 'here', {'and': 'more'}]
  • 该方法必须命名为 get_field_name(有一个选项可以更改它,但我没有真的看到任何使用它的意义)。
  • 您将实例序列化为 obj
  • 您可以 return 任何由常规类型(数字、字符串、字典、列表、元组、布尔值、None)组成的东西。
  • 如果数据必须来自外部,您应该让调用者将其添加到上下文中,并且它将在 self.context['foobar'].