The Expando Class

Nota:gli sviluppatori che creano nuove applicazioni sono fortemente incoraggiati a utilizzare la libreria client NDB, che offre diversi vantaggi rispetto a questa libreria client, ad esempio la memorizzazione automatica nella cache 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 di modello dei dati le cui proprietà sono determinate dinamicamente. Un modello Expando può avere una combinazione di proprietà fisse simili a Model e proprietà dinamiche assegnate a un'entità in fase di runtime.

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

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

Introduzione

Un modello Expando può avere proprietà fisse 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 Expando possono avere insiemi diversi di proprietà dinamiche e possono persino avere proprietà dinamiche con lo stesso nome ma tipi diversi. Le proprietà dinamiche sono sempre facoltative e non hanno un valore predefinito: non esistono finché non viene assegnato loro un valore.

Le proprietà dinamiche non possono utilizzare le istanze Property per eseguire la convalida, impostare i valori predefiniti o applicare la logica automatica ai valori. Le proprietà dinamiche memorizzano semplicemente i valori dei tipi di datastore supportati. Consulta la sezione 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 datastore. Vedi Nomi delle proprietà non consentiti.

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

Una sottoclasse Expando 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 Expando può avere proprietà sia fisse che 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 Expando 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 Expando è definito come segue:

class Expando(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 sottoclassata per definire il tipo di entità di dati.

Expando è una sottoclasse di Model ed eredita o esegue l'override dei suoi metodi.

Argomenti

genitore
L'istanza del modello o l'istanza della chiave per l'entità che è l'entità principale della nuova entità.
key_name

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

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

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 di parole chiave. Ogni nome corrisponde a un attributo della nuova istanza e può corrispondere a proprietà fisse definite nella classe Expando o a proprietà dinamiche.