2013-05-31 12 views
14

Sto sfruttando il metodo to_dict di ndb per convertire le proprietà di un oggetto in un dict python. Da tutto quello che posso dire, questo metodo non include chiave dell'oggetto o madre ai dict come da documentazione:Il metodo ndb to_dict non include la chiave dell'oggetto

https://developers.google.com/appengine/docs/python/ndb/modelclass#Model_to_dict

Tuttavia per la mia situazione ho bisogno la chiave per essere in dict. La mia preferenza sarebbe quella di sfruttare il metodo incorporato e la sottoclasse o qualcosa di simile piuttosto che creare il mio metodo to_dict.

Qual è il modo migliore per realizzare questo o mi manca qualcosa di ovvio? Grazie in anticipo.

FYI: Non sto sfruttando django per questo progetto ma invece python diretto implementato fino a gae.

risposta

29

Non manca nulla ;-)

basta aggiungere la chiave del dizionario dopo aver chiamato to_dict, e sì l'override del metodo.

Se si dispone di più modelli che non condividono la stessa classe base con to_dict personalizzato, lo implementerei come mixin.

per definire to_dict come metodo di una classe Mixin. avresti

class ModelUtils(object): 
    def to_dict(self): 
     result = super(ModelUtils,self).to_dict() 
     result['key'] = self.key.id() #get the key as a string 
     return result 

Quindi usarlo.

class MyModel(ModelUtils,ndb.Model): 
    # some properties etc... 
+0

Grazie Tim! Ha funzionato perfettamente Sono nuovo di Python e non so come sovrascrivere il metodo come si cita. Posso postarla come un'altra domanda a meno che tu non sia disposto a modificare la tua risposta e fornire una guida. Apprezzo la risposta rapida e mi sono divertito a imparare da te tramite tutte le altre risposte qui in pila. –

+0

Vedere le modifiche per un esempio. –

+0

Danke signore. mi ha aiutato anche –

2

Un altro modo semplice per raggiungere tale (senza dover eseguire l'override to_dict) è quello di aggiungere un ComputedProperty che restituisce l'id, in questo modo:

class MyModel(ndb.Model): 

    # this property always returns the value of self.key.id() 
    uid = ndb.ComputedProperty(lambda self: self.key.id(), indexed=False) 

    # other properties ... 

Un ComputedProperty saranno aggiunti al risultato di to_dict proprio come qualsiasi altra proprietà.

Ci sono solo due vincoli:

  1. A quanto pare il nome della proprietà non può essere key (dal momento che sarebbe in conflitto con la chiave effettiva) e id non funziona neanche.
  2. Questo non funzionerà se non si specifica una chiave o un ID quando si crea l'oggetto.

Inoltre, il valore calcolato verrà scritto nell'archivio dati quando si chiama put(), quindi consuma parte dello spazio di archiviazione.

Un vantaggio è che questo supporta gli argomenti include e exclude di to_dict() fuori dalla scatola.

+0

Questo non sembra funzionare quando inizialmente si crea un'entità poiché la chiave non è stata ancora definita. Sto ricevendo questo errore: 'uid = ndb.ComputedProperty (lambda self: self.key.id()) AttributeError: L'oggetto 'NoneType' non ha attributo 'id'' – Stetzon

+0

Corretto, questo è ciò che intendevo per vincolo n. 2 nella mia risposta. È necessario assegnare una chiave quando viene creato l'oggetto per farlo funzionare. Almeno nei miei casi di utilizzo non è un problema però. – Marten

+0

Sì, l'ho preso quasi subito dopo aver postato il mio commento. Devi aver perso la tua nota la prima volta. Grazie per il chiarimento. Sono stato in grado di farlo funzionare [assegnando e assegnando] (https://cloud.google.com/appengine/docs/python/ndb/creating-entity-keys#allocating_ids) una chiave all'entità prima del _put_ iniziale – Stetzon

Problemi correlati