Devi creare una classe di modello per l'entità. Puoi eseguire questa operazione in due modi:
- Crea una classe di modello che definisce le proprietà delle entità.
- Crea una classe di modello espandibili che non definisca in anticipo le entità.
Questo documento descrive come creare ciascuno di questi tipi di classi di modelli.
Descrive inoltre come creare un hook del modello, in modo che la tua applicazione possa eseguire del codice prima o dopo un determinato tipo di operazioni, ad esempio prima di ogni get()
.
Creazione di una classe di modelli con proprietà
Prima di creare un'entità, devi creare una classe di modello che definisca uno o altre proprietà dell'entità. Ad esempio:
...
dove vuoi che ogni entità Account abbia proprietà per nome utente, ID utente e email.
Per un elenco completo dei tipi di proprietà, consulta la sezione Riferimento alle proprietà delle entità.
Creazione di una classe di modelli Expando
Non è necessario utilizzare una classe modello che definisce le proprietà in anticipo.
Una sottoclasse di modello speciale chiamata Expando
modifica il comportamento delle sue entità in modo che qualsiasi attributo assegnato venga salvato nello spazio dati. Tieni presente
che questi attributi non possono iniziare con un trattino basso.
Ecco come creare un modello Expando:
...
Viene scritta un'entità nel data store con una proprietà foo
con valore intero 1
, una proprietà bar
con valore di stringa 'blah'
e una proprietà tag
ripetuta con valori di 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
Expando
sottoclasse:
...
Viene assegnato a employee
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
con proprietà non indicizzate,
imposta _default_indexed = False
nella definizione della sottoclasse:
...
Puoi anche impostare _default_indexed
su un'entità Expando
.
In questo caso, influenzerà tutte le proprietà assegnate dopo l'impostazione.
Un'altra tecnica utile è eseguire query su un tipo Expando
per una proprietà dinamica. R
query simile alla seguente
non funzionerà, perché la classe non ha un oggetto proprietà per la posizione
proprietà. 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
possono eseguire del codice prima o dopo un certo tipo di operazioni; ad esempio Model
potrebbe eseguire alcune funzioni prima ogni get()
.
Una funzione hook viene eseguita quando si utilizzano le versioni sincrona, asincrona e multi-versione
del metodo appropriato. Ad esempio, un "pre-lancio" si applica a tutti gli elementi
get()
, get_async()
e get_multi()
. Esistono versioni pre-RPC e post-RPC
di ogni gancio.
Gli hook possono essere utili per:
- memorizzazione nella cache delle query
- controllo dell'attività di Cloud Datastore per utente
- imitazione dei trigger di database
L'esempio seguente mostra come definire le funzioni hook:
...
...
Se utilizzi i post-hook con API asincrone, gli hook vengono attivati chiamando check_result()
, get_result()
o restituendo (all'interno di un tasklet) il futuro di un metodo asincrono.
I hook post non controllano se l'RPC è andata a buon fine;
l'hook viene eseguito indipendentemente dall'errore.
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 si bloccherà, poiché Future
è completato al momento della chiamata dell'hook.
L'attivazione 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 eseguire la preemption di un'RPC sollevando tasklets.Return
in un hook pre-RPC.
Passaggi successivi
- Scopri di più sulla classe Model di NDB.
- Esplora la documentazione di riferimento delle proprietà delle entità.