Sto dando il tocco finale su una API che ho scritto per un'app Django che utilizza django-pistone. L'API è in grado di cercare per richiesta o indirizzo IP, rispettivamente, Request
o IPAddress
istanze. A ciascuna richiesta può essere associato 1 o più IPAddress
.Pistone Django: come posso escludere i campi nidificati dai risultati del gestore? È possibile?
Quindi, ad esempio, ho una chiamata API che mostra tutti gli oggetti IPAddress
che corrispondono a uno stato di attività "attivo", "inattivo" o "tutto" (per entrambi). Lo Request
a cui è associata ciascuna istanza IPAddress
è disponibile come IPAddress.request
.
Il problema che sto avendo è che Request.inputter
è una chiave esterna all'istanza User
della persona che ha eseguito il provisioning della richiesta. Quando i risultati vengono restituiti dal gestore che ho creato per questa chiamata API, vengono visualizzati tutti i campi dall'istanza User
, incluso password
.
Questo è male; Non voglio questo.
Così qui è il mio gestore:
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)
E qui è un esempio dei risultati da /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 protected]</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>
Tutto voglio davvero nei risultati è la inputter.username
, non tutti i altre cose. Ho provato varie iterazioni di implementazione di un attributo exclude
sul gestore senza alcun risultato. Se ho appena saltare l'intero campo di richiesta, che funziona bene, in questo modo:
In handler:
exclude = ('request',)
che si traduce in:
<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>
Ma questi risultati sono, inoltre, non quello che voglio .
Così, finalmente, la mia domanda:
campi Come posso escludere annidati dai risultati del gestore? È possibile?
ho provato varie iterazioni del seguente, i quali o non hanno seguito, o risultati non voluti:
# try to exclude request.inputter
exclude = (('request', ('inputter',),))
# try to exclude request.inputter.password
exclude = (('request', ('inputter', ('password',))))
Suppongo che sto incomprensione o uso improprio il modo in cui le esclusioni di campo sono fatte in questo contesto quindi qualsiasi illuminazione su questo argomento è molto apprezzata.
Questo funziona davvero. Grazie per la risposta! Più noioso di quello che speravo (soprattutto quando dovrò duplicarlo invetabilmente su più gestori), ma una soluzione è una soluzione! – jathanism