Я добавляю последние штрихи к API, который я написал для приложения Django, использующего django-поршень. 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', ) ) ) )
Я предполагаю, что я неправильно понимаю или неправильно использую способ исключения полей в этом контексте, поэтому любое просвещение по этой теме очень ценится.