5

我正在对使用 django-piston 为 Django 应用程序编写的 API 进行最后润色。API能够通过请求或IP地址分别搜索RequestIPAddress实例。每个请求可以有 1 个或多个IPAddress与之关联。

因此,例如,我有一个 API 调用,它将显示IPAddress与“活动”、“非活动”或“全部”的活动状态匹配的所有对象(对于任何一个)。每个实例关联RequestIPAddress可用作IPAddress.request

我遇到的问题是提供请求的人Request.inputter的实例的外键。User当我为此 API 调用创建的处理程序返回结果时,User将显示实例中的所有字段,包括password.

这是不好的; 我不想要这个。

所以这是我的处理程序:

class SearchByIPStatusHandler(BaseHandler):
    model = IPAddress
    allowed_methods = ('GET',)
    anonymous = AnonymousIPHandler

    def read(self, request, status):
        """
        Returns IP addresses based on activity status.  
        Status: 'active', 'inactive', 'all'

        """
        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/

<response>
  <resource>
    <updated>2010-02-05 17:08:53.651729</updated>
    <expires>2010-02-12 17:08:23</expires>
    <created>2010-02-05 17:08:53.625318</created>
    <nexthop>255.255.255.255</nexthop>
    <netmask>255.255.255.254</netmask>
    <address>2.4.6.80/31</address>
    <active>True</active>
    <id>4</id>
    <request>
      <updated>2010-02-05 17:08:53.382381</updated>
      <created>2010-02-05 17:08:53.382313</created>
      <expires>2010-02-12 17:08:23</expires>
      <incident>20100212-badthings-01</incident>
      <reason>bad things happened</reason>
      <inputter>
        <username>jathan</username>
        <first_name>Jathan</first_name>
        <last_name>McCollum</last_name>
        <is_active>True</is_active>
        <email>email@fake.notreal</email>
        <is_superuser>True</is_superuser>
        <is_staff>True</is_staff>
        <last_login>2010-02-05 18:55:51.877746</last_login>
        <password>[ENCRYPTED STRING I REDACTED]</password>
        <id>1</id>
        <date_joined>2010-01-28 09:56:32</date_joined>
      </inputter>
      <requester>joeuser</requester>
      <active>True</active>
    </request>
  </resource>
</response>

我真正想要的结果是inputter.username,而不是所有其他的东西。我尝试了exclude在处理程序上实现属性的各种迭代,但无济于事。如果我只是跳过整个请求字段,那效果很好,如下所示:

在处理程序中:

exclude = ('request', )

结果是:

<response>
  <resource>
    <updated>2010-02-05 17:08:53.651729</updated>
    <expires>2010-02-12 17:08:23</expires>
    <created>2010-02-05 17:08:53.625318</created>
    <nexthop>255.255.255.255</nexthop>
    <netmask>255.255.255.254</netmask>
    <address>2.4.6.80/31</address>
    <active>True</active>
    <id>4</id>
  </resource>
</response>

但这些结果也不是我想要的。

所以,最后,我的问题:

如何从处理程序结果中排除嵌套字段?甚至可能吗?

我尝试了以下各种迭代,所有这些迭代要么没有结果,要么没有预期的结果:

# try to exclude request.inputter
exclude = ( ('request', ('inputter', ), ) )

# try to exclude request.inputter.password
exclude = ( ('request', ('inputter', ('password', ) ) ) ) 

我假设我误解或误用了在这种情况下完成字段排除的方式,因此非常感谢对这个主题的任何启发。

4

2 回答 2

3

您可以通过处理程序的fields =子句指定所需的字段来获得所需的结果。

来自外键的模型字段可以这样指定:

('foreign_model_field', ('nested_field1', 'nested_field2'))

在您的情况下,以下内容应该有效(为简洁起见,您的一些字段被省略了):

fields = ('updated', 'expires', 'created', 
    ('request', ('incident', 'reason', ('inputter', ('username',)))))
于 2010-02-09T01:03:37.760 回答
3

您可以尝试使用包含而不是排除吗?例如

include = (('request', ('inputter', ('username', 'therestofthefields'))))

我不记得我是否写得excludeinclude.

此外,django-piston Google 小组是我们讨论最多事情的地方,您在那里提出这个问题可能会更成功。

于 2010-02-07T09:47:47.200 回答