Devi creare una classe modello per la tua entità. Puoi farlo in due modi:
- Crea una classe modello che definisca le proprietà dell'entità.
- Crea una classe modello expando che non definisca le entità in anticipo.
Questo documento descrive come creare ciascuno di questi tipi di classi modello.
Descrive anche come creare un hook del modello, in modo che l'applicazione possa eseguire del codice prima o dopo alcuni tipi di operazioni, ad esempio prima di ogni get().
Creazione di una classe modello con proprietà
Prima di creare un'entità, devi creare una classe modello che definisca una o più proprietà dell'entità. Ad esempio:
...
dove vuoi che ogni entità Account abbia proprietà per nome utente, ID utente ed email.
Per un elenco completo dei tipi di proprietà, consulta il riferimento alle proprietà delle entità.
Creazione di una classe modello Expando
Non devi utilizzare una classe modello che definisca le proprietà in anticipo.
Una sottoclasse modello speciale denominata Expando modifica il comportamento delle relative entità in modo che qualsiasi attributo assegnato venga salvato nel datastore. Tieni presente che questi attributi non possono iniziare con un trattino basso.
Ecco come creare un modello Expando:
...
In questo modo viene scritta un'entità nel datastore con una proprietà foo con valore intero
1, una proprietà bar con valore stringa 'blah' e una proprietà tag ripetuta
con valori stringa 'exp', 'and' e 'oh'. Le proprietà sono indicizzate e puoi esaminarle utilizzando l'attributo _properties dell'entità:
Un Expando creato recuperando un valore dal datastore ha proprietà per tutti i valori delle proprietà salvati nel datastore.
Un'applicazione può aggiungere proprietà predefinite a una sottoclasse Expando:
...
In questo modo, employee ha un attributo name con valore 'Sandy', un attributo age
con valore None e un attributo dinamico location con valore
'SF'.
Per creare una sottoclasse Expando le cui proprietà non sono indicizzate, imposta _default_indexed = False nella definizione della sottoclasse:
...
Puoi anche impostare _default_indexed su un'entità Expando. In questo caso, influirà su tutte le proprietà assegnate dopo l'impostazione.
Un'altra tecnica utile è eseguire query su un tipo Expando per una proprietà dinamica. Una query come la seguente
non funzionerà perché la classe non ha un oggetto proprietà per la proprietà location. Utilizza invece GenericProperty, la classe utilizzata da Expando per le proprietà dinamiche:
Utilizzo degli hook del modello
NDB offre un meccanismo di hooking leggero. Definendo un hook, un'applicazione può eseguire del codice prima o dopo alcuni tipi di operazioni; ad esempio, un Model potrebbe eseguire una funzione prima di ogni get().
Una funzione hook viene eseguita quando si utilizzano le versioni sincrone, asincrone e multiple del metodo appropriato. Ad esempio, un hook "pre-get" si applicherebbe a tutti i metodi get(), get_async() e get_multi(). Esistono versioni pre-RPC e post-RPC di ogni hook.
Gli hook possono essere utili per:
- Memorizzazione nella cache delle query
- Controllo dell'attività di Cloud Datastore per utente
- Simulazione degli attivatori di database
L'esempio seguente mostra come definire le funzioni hook:
...
...
Se utilizzi i post-hook con le API asincrone, gli hook vengono attivati chiamando check_result(), get_result() o generando (all'interno di un tasklet) il futuro di un metodo asincrono. I post-hook non verificano se l'RPC è andata a buon fine; l'hook viene eseguito indipendentemente dall'errore.
Tutti i post-hook hanno un Future
argomento alla fine della firma della chiamata. Questo oggetto Future contiene il risultato dell'azione. Puoi chiamare get_result() su questo Future per recuperare il risultato; puoi essere certo che get_result() non si bloccherà, poiché Future è completato al momento della chiamata dell'hook.
La generazione di un'eccezione durante un pre-hook impedisce l'esecuzione della richiesta.
Sebbene gli hook vengano attivati all'interno dei metodi <var>*</var>_async, non puoi
anticipare un RPC generando tasklets.Return in un hook pre-RPC.