Я заканчиваю на 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', ) ) ) )
Я предполагаю, что неправильно понимаю или неправильно использую способ, которым полевые исключения сделаны в этом контексте, таким образом, любое просвещение по этой теме значительно ценится.
Вы можете получить желаемый результат, указав нужные поля через выражение обработчика fields =
.
Поля модели, поступающие от иностранных ключей, могут быть указаны следующим образом:
('foreign_model_field', ('nested_field1', 'nested_field2'))
В вашем случае должно сработать следующее (некоторые из ваших полей оставлены для краткости):
fields = ('updated', 'expires', 'created',
('request', ('incident', 'reason', ('inputter', ('username',)))))
Можете ли вы попробовать использовать include вместо exclude? Например.
include = (('request', ('inputter', ('username', 'therestofthefields'))))
Я не помню, писал ли я exclude
, чтобы он был таким же универсальным, как include
.
Кроме того, группа Google django-поршня - это то место, где мы обсуждаем большинство вещей. Возможно, вам удастся задать этот вопрос там.