我正在对使用 django-piston 为 Django 应用程序编写的 API 进行最后润色。API能够通过请求或IP地址分别搜索Request
或IPAddress
实例。每个请求可以有 1 个或多个IPAddress
与之关联。
因此,例如,我有一个 API 调用,它将显示IPAddress
与“活动”、“非活动”或“全部”的活动状态匹配的所有对象(对于任何一个)。每个实例关联Request
的IPAddress
可用作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', ) ) ) )
我假设我误解或误用了在这种情况下完成字段排除的方式,因此非常感谢对这个主题的任何启发。