2010-02-07 8 views
5

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.

risposta

3

È possibile ottenere il risultato desiderato specificando i campi desiderati tramite la clausola fields = del gestore.

campi Girl provenienti da chiavi esterne possono essere specificati in questo modo:

('foreign_model_field', ('nested_field1', 'nested_field2')) 

Nel tuo caso, il seguente dovrebbe funzionare (alcuni dei vostri campi lasciati fuori per brevità):

fields = ('updated', 'expires', 'created', 
    ('request', ('incident', 'reason', ('inputter', ('username',))))) 
+0

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

3

Puoi provare a utilizzare include anziché escludere? Per esempio.

include = (('request', ('inputter', ('username', 'therestofthefields')))) 

Non mi ricordo se ho scritto exclude di essere versatile come include.

Inoltre, il gruppo Google di pistone Django è il luogo in cui discutiamo la maggior parte delle cose, potreste avere più successo a fare questa domanda lì.

+0

Grazie per intervenendo, Jesper. Lo ingannerò sulla mailing list. – jathanism

Problemi correlati