Devi creare una classe modello per la tua entità. Puoi farlo in due modi:
- Crea una classe di modello che definisca le proprietà dell'entità.
- Crea una classe di modello espandibile che non definisce le entità in anticipo.
Questo documento descrive come creare ciascuno di questi tipi di classi di modelli.
Descrive inoltre 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 di modello con proprietà
Prima di creare un'entità, devi creare una classe di modello che definisca una o più proprietà dell'entità. Ad esempio:
...
in cui vuoi che ogni entità Account abbia proprietà per nome utente, ID utente ed email.
Per un elenco completo dei tipi di proprietà, consulta il documento Entity Property Reference.
Creazione di una classe di modello Expando
Non devi utilizzare una classe modello che definisce le proprietà in anticipo.
Una sottoclasse speciale del modello chiamata Expando
modifica il comportamento
delle sue entità in modo che qualsiasi attributo assegnato venga salvato nell'datastorei. 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à nell'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à vengono indicizzate e puoi esaminarle utilizzando l'attributo
_properties
dell'entità:
Un Expando
creato ottenendo 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 è l'interrogazione di 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à
posizione. 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 un determinato tipo di operazioni; ad esempio, un Model
potrebbe eseguire una funzione prima di ogni get()
.
Una funzione hook viene eseguita quando si utilizzano le versioni sincrona, asincrona e multiversione
del metodo appropriato. Ad esempio, un hook "pre-get" si applicherebbe a tutti i
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
- imitare i trigger del database
L'esempio seguente mostra come definire le funzioni di 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) la futura
di un metodo asincrono.
I post-hook non controllano se la RPC è andata a buon fine;
l'hook viene eseguito indipendentemente dall'esito negativo.
Tutti i post-hook hanno un argomento Future
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 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 una RPC generando tasklets.Return
in un hook pre-RPC.
Passaggi successivi
- Scopri di più sulla classe NDB Model.
- Esplora la documentazione di riferimento delle proprietà delle entità.