La classe Espandio

Nota: gli sviluppatori che creano nuove applicazioni sono vivamente invitati a utilizzare la libreria client NDB, che offre diversi vantaggi rispetto a questa libreria client, ad esempio la memorizzazione nella cache automatica delle entità tramite l'API Memcache. Se al momento utilizzi la libreria client DB precedente, leggi la guida alla migrazione da DB a NDB

La classe Expando è una superclasse per le definizioni del modello di dati le cui proprietà vengono determinate dinamicamente. Un modello Expando può avere una combinazione di proprietà fisse simili a Modello e proprietà dinamiche assegnate a un'entità in fase di esecuzione.

Expando è fornito dal modulo google.appengine.ext.db.

Expando è una sottoclasse di Model e ne eredita i metodi di classe e istanza. La classe Espandio non definisce né sostituisce alcun metodo.

Introduzione

Un modello Espandio può avere proprietà e proprietà dinamiche. Le proprietà fisse si comportano in modo simile alle proprietà di un modello e sono definite in modo simile nella classe del modello Expando utilizzando gli attributi di classe. Le proprietà dinamiche vengono create quando vengono assegnati valori all'istanza. Due istanze della stessa classe Espandio possono avere diversi insiemi di proprietà dinamiche e anche proprietà dinamiche con lo stesso nome, ma tipi diversi. Le proprietà dinamiche sono sempre facoltative e non hanno un valore predefinito, in quanto non esistono finché non viene assegnato loro un valore.

Le proprietà dinamiche non possono utilizzare istanze Proprietà per eseguire la convalida, configurare valori predefiniti o applicare logica automatica ai valori. Le proprietà dinamiche archiviano semplicemente i valori dei tipi di datastore supportati. Consulta Tipi e classi di proprietà.

Inoltre, a differenza delle proprietà fisse, le proprietà dinamiche non possono utilizzare un nome diverso per l'attributo della classe e il nome della proprietà del data store. Consulta Nomi proprietà non consentiti.

Suggerimento: se vuoi convalidare il valore di una proprietà dinamica utilizzando una classe Property, puoi creare un'istanza per la classe Property e richiamare il relativo metodo validate() sul valore.

Una sottoclasse Espandio può definire proprietà fisse simili a una classe Model. Le proprietà fisse di un Expando si comportano in modo simile alle proprietà di un modello. Un'istanza Espandio può avere proprietà sia fisse sia dinamiche.

import datetime

from google.appengine.ext import db

class Song(db.Expando):
    title = db.StringProperty()

crazy = Song(title='Crazy like a diamond',
             author='Lucy Sky',
             publish_date='yesterday',
             rating=5.0)

hoboken = Song(title='The man from Hoboken',
               author=['Anthony', 'Lou'],
               publish_date=datetime.datetime(1977, 5, 3))

crazy.last_minute_note=db.Text('Get a train to the station.')

Le proprietà dinamiche (non fisse) di un'istanza Espandio possono essere eliminate. Per eliminare una proprietà dinamica, un'applicazione elimina l'attributo dell'istanza:

del crazy.last_minute_note

Costruttore

Il costruttore della classe Espandio è definito come segue:

class Espandio(parent=None, key_name=None, **kwds)

Una classe di modello le cui proprietà non devono essere definite nella classe prima dell'uso. Come Model, la classe Expando deve essere sottoclassificata per definire il tipo di entità di dati.

Expando è una sottoclasse di Model e ne eredita o sostituisce i metodi.

Argomenti

padre
L'istanza Model o Key per l'entità principale della nuova entità.
key_name

Il nome della nuova entità. Il nome diventa parte della chiave primaria. Se None, per la chiave viene utilizzato un ID generato dal sistema.

Il valore di key_name non deve iniziare con un numero e non deve essere nel formato __*__. Se la tua applicazione utilizza dati inviati dall'utente come nomi di chiavi di entità del datastore (ad esempio un indirizzo email), per soddisfare questi requisiti l'applicazione deve prima sanificare il valore, ad esempio anteponendovi una stringa nota come "key:".

Un key_name viene memorizzato come stringa Unicode, con i valori str convertiti come testo ASCII.

**kwds
Valori iniziali per le proprietà dell'istanza, come argomenti delle parole chiave. Ogni nome corrisponde a un attributo della nuova istanza e può corrispondere a proprietà fisse definite nella classe Espandio o essere proprietà dinamiche.