Django:从json响应中过滤掉几个字段

时间:2016-11-15 09:44:44

标签: python django

首先,我对Django世界很新,可能会有类似的问题,但是我找不到满意的答案。

这是我的场景,我有很少的外部REST端点,我将从我的Django应用程序中点击并获得100键的JSON响应。现在,当我在Django应用程序中编写API时,我将不得不修剪并将其发送到外部世界。比如说, 我的API是,

GET /api/profiles/1472

将为用户配置文件提供id为1472.现在,此API将调用其他一些REST端点并获取实际配置文件的数据。所以,在某种程度上我正在编写一个代理端点。该代理端点应该删除一些字段并将其返回给调用者。

我没有为此编写模型类。

在Django中实现这一目标的最佳方法是什么?

编辑1: 示例视图将是这样的,

class GetCompetitorProductsView(APIView):
    """
    Get Competitor products view
    """

    def post(self, request, format=None):
        # I'll be having a list of fields to be trimmed from response.
        # It will be separate for every API.
        data = request.data

        error_checks = system_errors.check_for_competitor_products_input_error(data)

        if not error_checks:
            response = call_to_rest(data)
            return Response(response)
        else :
            return Response(error_checks, status = status.HTTP_412_PRECONDITION_FAILED)

还有一件事,相同的行为适用于所有其他API。所以,我需要更通用的解决方案,可以很容易地应用到其他API。

2 个答案:

答案 0 :(得分:0)

基本上这是如何在python中过滤

 allowed_fields = ("first_name", "last_name", "email")
 user_info = call_rest_endpoint(id=1472)
 result = {key:value for key,value in user_info.items() if key in allowed_fields}

第一行定义您想要返回的字段。

第二行调用端点并从其聚会API获取数据。

第三行包含3个陈述。

  1. user_info.items()将字典转换为数组键/值paris。
  2. 从这些元组构建字典
  3. 但仅限于在allowed_fields元组中找到密钥

答案 1 :(得分:0)

您可以创建将放置在视图父项中的函数或mixin,然后使用它进行修剪。这是示例

class TrimDataMixin(object):
    ALLOWED_FIELDS = None

    def trim_data(self, data):
        allowed_fields = self.ALLOWED_FIELDS or []
        return {k: v for k, v in data.items() if k in allowed_fields}


class GetCompetitorProductsView(TrimDataMixin, APIView):
    """
    Get Competitor products view
    """
    ALLOWED_FIELDS = ['first_name', 'last_name']

    def post(self, request, format=None):
        # I'll be having a list of fields to be trimmed from response.
        # It will be separate for every API.
        data = request.data

        error_checks = system_errors.check_for_competitor_products_input_error(data)

        if not error_checks:
            response = call_to_rest(data)
            # trim data            
            response = self.trim_data(response)
            return Response(response)
        else:
            return Response(error_checks, status = status.HTTP_412_PRECONDITION_FAILED)