Devi creare una classe di modello per l'entità. Puoi farlo in due modi:
- Crea una classe di modello che definisce le proprietà dell'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 l'applicazione possa eseguire codice prima o dopo qualche tipo di operazione, ad esempio prima di ogni get()
.
Creazione di una classe di modello con proprietà
Prima di creare un'entità, devi creare una classe del modello che definisce una o più proprietà dell'entità. Ad esempio:
...
in cui vuoi che ogni entità Account abbia le proprietà per nome utente, ID utente ed email.
Per un elenco completo dei tipi di proprietà, consulta la pagina Riferimento alle proprietà delle entità.
Creazione di una classe di modello Espandio
Non è necessario utilizzare una classe di modello che definisce le proprietà in anticipo.
Una sottoclasse speciale del modello denominata Expando
modifica il comportamento
delle entità in modo che tutti gli attributi assegnati vengano salvati nel datastore. Tieni presente che questi attributi non possono iniziare con un trattino basso.
Ecco come creare un modello Espandio:
...
Questa operazione scrive un'entità nel datastore 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 controllarle utilizzando
l'attributo _properties
dell'entità:
Un elemento 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
:
...
Questo assegna 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
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 Expando
usata per le proprietà
dinamiche:
Utilizzo di Model Hook
NDB offre un meccanismo di aggancio leggero. Se definisci un hook, un'applicazione
può eseguire codice prima o dopo qualche tipo di operazioni; ad esempio, un Model
potrebbe eseguire alcune funzioni 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" viene applicato a tutti gli elementi 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
- imitazione dei trigger di database
L'esempio seguente mostra come definire le funzioni hook:
...
...
Se utilizzi post-hook con API asincrone, gli hook vengono attivati chiamando
check_result()
, get_result()
o rendendo (all'interno di un tasklet) il futuro di un
metodo asincrono.
Gli hook post non verificano se la RPC è riuscita; 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 bloccherà, dato che Future
è completo quando l'hook viene chiamato.
Se viene sollevata un'eccezione durante un pre-hook, la richiesta non viene eseguita.
Anche se gli hook vengono attivati all'interno dei metodi <var>*</var>_async
, non è possibile
prerilasciare una RPC aumentando tasklets.Return
in un hook pre-RPC.
Passaggi successivi
- Scopri di più sulla classe del modello NDB.
- Esplora la documentazione di riferimento delle proprietà entità.