Django Piston: 如何从处理程序结果中排除嵌套字段?这是否可行?

47 阅读3分钟

在使用 Django Piston 为 Django 应用程序编写的 API 中添加最后修饰。API 能够通过请求或 IP 地址进行搜索,这些地址分别是 Request 或 IPAddress 实例。每个请求可以与 1 个或多个 IPAddress 相关联。

例如,有一个 API 调用将显示所有活动状态为“活动”、“非活动”或“全部”(任一活动状态)的 IPAddress 对象。每个 IPAddress 实例关联的 Request 可用作 IPAddress.request。

存在的问题是,Request.inputter 是使配置请求的人员的用户实例的外键。从为这个 API 调用创建的处理程序返回结果时,将显示用户实例的所有字段,包括密码。这很糟糕;不想要这个。

以下是处理程序: class SearchByIPStatusHandler(BaseHandler): model = IPAddress allowed_methods = ('GET', ) anonymous = AnonymousIPHandler

def read(self, request, status): 
    """ 
    根据活动状态返回 IP 地址。
    状态:“活动”、“非活动”、“全部”

    """ 
    if status == 'all': 
        return self.model.objects.all() 
    else: 
        active = True if (status=='active') else False 
        return self.model.objects.filter(active=active)

以下是 /api/show/all/ 的结果示例: 2010-02-05 17:08:53.651729 2010-02-12 17:08:23 2010-02-05 17:08:53.625318 255.255.255.255 255.255.255.254

2.4.6.80/31 True 4 2010-02-05 17:08:53.382381 2010-02-05 17:08:53.382313 2010-02-12 17:08:23 20100212-badthings-01 bad things happened jathan <first_name>Jathan</first_name> <last_name>McCollum</last_name> <is_active>True</is_active> email@fake.notreal <is_superuser>True</is_superuser> <is_staff>True</is_staff> <last_login>2010-02-05 18:55:51.877746</last_login> [ENCRYPTED STRING I REDACTED] 1 <date_joined>2010-01-28 09:56:32</date_joined> joeuser True

结果中真正需要的是 inputter.username,而不是其他所有内容。已经尝试了在处理程序上实现 exclude 属性的各种迭代,但无济于事。如果跳过整个 request 字段,那么就可以正常工作,如下所示: 在处理程序中: exclude = ('request', )

这导致的结果是: 2010-02-05 17:08:53.651729 2010-02-12 17:08:23 2010-02-05 17:08:53.625318 255.255.255.255 255.255.255.254

2.4.6.80/31 True 4

但这些结果也不是想要的。最后,问题是:如何从处理程序结果中排除嵌套字段?这是否可行?已经尝试了以下内容的各种迭代,但都未产生结果或产生意外结果: # 尝试排除 request.inputter exclude = ( ('request', ('inputter', ), ) )

尝试排除 request.inputter.password exclude = ( ('request', ('inputter', ('password', ) ) ) )

认为我对这种情况下字段排除的方式理解错误或使用不当,因此对此主题的任何启发都将极大地受到赞赏。

2、解决方案 答案1: 尝试使用 include 而不是 exclude。例如: include = (('request', ('inputter', ('username', 'therestofthefields'))))

不记得是否编写了 exclude 来使其与 include 一样通用。另外,django-piston Google 组是我们讨论大多数事情的地方,你可能在那里询问这个问题会更成功。

答案2: 可以通过指定处理程序的 fields = 子句来获得所需的结果。来自外键的模型字段可以这样指定: ('foreign_model_field', ('nested_field1', 'nested_field2'))

在你的例子中,以下应该有效(为了简洁省略了一些字段): fields = ('updated', 'expires', 'created',('request', ('incident', 'reason', ('inputter', ('username',)))))