Django Piston:如何在处理结果中排除嵌套字段?这可能吗?
我正在为一个使用django-piston的Django应用程序完善一个API。这个API可以根据请求或IP地址进行搜索,分别对应Request
和IPAddress
实例。每个请求可以关联一个或多个IPAddress
。
举个例子,我有一个API调用,可以显示所有活动状态为“active”、“inactive”或“all”(两者都可以)的IPAddress
对象。每个IPAddress
实例关联的Request
可以通过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', ) ) ) )
我想我可能误解了或错误使用了在这种情况下排除字段的方式,所以任何关于这个主题的启发都非常感谢。
2 个回答
你可以试试用包含(include)来代替排除(exclude)吗?比如说:
include = (('request', ('inputter', ('username', 'therestofthefields'))))
我不太记得我写的 exclude
是否像 include
那样灵活。
另外,django-piston 的 Google 群组是我们讨论大部分事情的地方,你在那儿问这个问题可能会更有帮助。
你可以通过处理器的 fields =
这个部分来指定你想要的字段,从而得到想要的结果。
如果是外键关联的模型字段,可以这样指定:
('foreign_model_field', ('nested_field1', 'nested_field2'))
在你的情况下,下面的代码应该可以正常工作(为了简洁,有些字段省略了):
fields = ('updated', 'expires', 'created',
('request', ('incident', 'reason', ('inputter', ('username',)))))