Devi creare una classe del modello per l'entità. Puoi farlo in due modi:
- Crea una classe del modello che definisca le proprietà dell'entità.
- Crea una classe di modello expando che non definisca in anticipo le entità.
Questo documento descrive come creare ognuno 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 del modello con proprietà
Prima di creare un'entità, devi creare una classe del modello che definisca una o più proprietà dell'entità. Ad esempio:
...
e vuoi che ogni entità account abbia proprietà per nome utente, ID utente ed email.
Per un elenco completo dei tipi di proprietà, consulta la documentazione di riferimento sulle proprietà delle entità.
Creazione di una classe di modello expando
Non è necessario utilizzare una classe del modello che definisce le proprietà in anticipo.
Una sottoclasse speciale del modello denominata Expando
modifica il comportamento delle
proprie 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:
...
Nel datastore viene scritta un'entità con una
proprietà foo
con valore intero 1
,
una proprietà bar
con valore di stringa 'blah'
e una proprietà tag
ripetuta con valori
stringa 'exp'
, 'and'
e 'oh'
.
Le proprietà sono indicizzate e puoi controllarle utilizzando
l'attributo _properties
dell'entità:
Un Expando
creato recuperando un valore
dal datastore include proprietà per tutti i valori della proprietà salvati
nel datastore.
Un'applicazione può aggiungere proprietà predefinite a una
sottoclasse Expando
:
...
A employee
viene assegnato 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, ciò 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 funzioneranno, perché la classe non ha un oggetto per la proprietà location. Utilizza invece GenericProperty
, la classe Expando
utilizzata per le proprietà
dinamiche:
Utilizzo dei ganci per modelli
NDB offre un meccanismo di aggancio leggero. Definindo un hook, un'applicazione può eseguire del codice prima o dopo alcuni tipi di operazioni. Ad esempio, un elemento Model
potrebbe eseguire alcune funzioni prima di ogni get()
.
Una funzione di hook viene eseguita quando si utilizzano le versioni sincrone, asincrone e multiple del metodo appropriato. Ad esempio, un hook "pre-get" verrà applicato a
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 di hook:
...
...
Se utilizzi gli hook post-hook con API asincrone, questi vengono attivati chiamando
check_result()
, get_result()
o generando (all'interno di una tasklet) il futuro di
un metodo asincrono.
Gli hook post non controllano se l'RPC ha avuto esito positivo;
l'hook viene eseguito indipendentemente dall'errore.
Tutti gli hook 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 assicurarti che get_result()
non blocchi, poiché Future
è completo nel momento in cui viene chiamato l'hook.
Se aumenti un'eccezione durante un pre-hook impedisce che la richiesta abbia luogo.
Anche se gli hook vengono attivati all'interno dei metodi <var>*</var>_async
, non puoi
prerilasciare una RPC sollevando tasklets.Return
in un hook pre-RPC.
Passaggi successivi
- Scopri di più sulla classe del modello NDB.
- Esplora la documentazione di riferimento della proprietà dell'entità.