首页 > 解决方案 > 使用单个 API 调用的 Django REST 框架序列化器字段

问题描述

我有一条使用 ViewSet 的路线

router.register(
    r'mapping_details',
    GlobalMappingDetailsViewSet,
    base_name='global-store-product-mappings'
)

此视图集包含一个get_queryset方法和一个序列化程序。

class GlobalMappingDetailsViewSet(viewsets.ModelViewSet):
    serializer_class = GlobalMappingDetailsSerializer

    def get_queryset(self):
        return models.Mappings.objects.all().select_related('my_column')

class GlobalMappingDetailsSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Mappings
        fields = ('column1', 'column2')

我想在请求的响应中添加 2 个使用单个 API 调用填充的字段。我可以使用serializers.Field,但必须对这两个字段进行单独调用。

有人知道处理这个用例的正确方法吗?

标签: pythondjangodjango-rest-framework

解决方案


做到这一点的方法是覆盖Django Viewset 操作。在我的情况下,我只需要在字段中填充响应,我覆盖了listandretrieve操作并将字段添加到响应中。

一些示例代码:

def retrieve(self, request, *args, **kwargs):
    response = super(GlobalMappingDetailsViewSet, self).retrieve(request, *args, **kwargs)
    data = response.data
    api_response = MyService.make_api_call(data.get('id'))
    data['my_new_field'] = api_response.get('response_field', '')
    return response

推荐阅读