Clase Expando

Nota: Se recomienda enfáticamente a los desarrolladores que compilan aplicaciones nuevas que usen la biblioteca cliente de NDB, ya que tiene muchas ventajas en comparación con esta biblioteca cliente, como el almacenamiento en caché automático de entidades mediante la API de Memcache. Si por el momento usas la biblioteca cliente de DB anterior, lee la Guía de migración de DB a NDB.

La clase Expando es una superclase para las definiciones de modelo de datos cuyas propiedades se terminan de forma dinámica. Un modelo Expando puede tener una combinación de propiedades fijas similar a Model y propiedades dinámicas asignadas a una entidad en el tiempo de ejecución.

El módulo google.appengine.ext.db proporciona Expando.

Expando es una subclase de Model, y hereda la clase y los métodos de instancia de esa clase. La clase Expando no define ni anula métodos.

Introducción

Un modelo Expando puede tener propiedades fijas y dinámicas. Las propiedades fijas se comportan de forma similar a las propiedades de un Model, y se definen en la clase de modelo Expando mediante los atributos de clase. Las propiedades dinámicas se crean cuando se asignan valores a la instancia. Dos instancias de la misma clase Expando pueden tener diferentes conjuntos de propiedades dinámicas y, además, pueden tener propiedades dinámicas con el mismo nombre, pero tipos diferentes. Las propiedades dinámicas siempre son opcionales y no tienen un valor predeterminado: no existen hasta que tengan un valor asignado.

Las propiedades dinámicas no pueden usar instancias Property para validar conjuntos predeterminados o aplicar lógica a los valores de forma automática. Estas propiedades simplemente almacenan valores de los tipos de los almacenes de datos compatibles. Consulta Tipos y clases de propiedades.

A diferencia de las propiedades fijas, las dinámicas no pueden usar un nombre diferente para el atributo de clase y el nombre de propiedad del almacén de datos. Consulta Nombres de propiedad no permitidos.

Sugerencia: Si deseas validar un valor de propiedad dinámica mediante una clase Property, puedes crear una instancia para esa clase y llamar a su método validate() en el valor.

Una subclase Expando puede definir propiedades fijas de la misma manera que una clase Model. Las propiedades fijas de Expando tienen el mismo comportamiento que las propiedades de Model. Una instancia de Expando puede tener propiedades fijas y dinámicas.

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.')

Las propiedades dinámicas (no fijas) de una instancia Expando se pueden borrar. Para borrar una propiedad dinámica, una aplicación borra el atributo de la instancia:

del crazy.last_minute_note

Constructor

El constructor de la clase Expando se define de la siguiente manera:

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

Una clase de modelo cuyas propiedades no deben definirse en la clase antes de usarlas. Como Model, la clase Expando debe ser una subclase para definir el tipo de entidades de datos.

Expando es una subclase de Model, y hereda o anula sus métodos.

Argumentos

parent
La instancia Model o la instancia Key correspondientes a la entidad superior de la entidad nueva.
key_name

El nombre de la entidad nueva. El nombre forma parte de la clave primaria. Si el valor es None, se usa un ID generado por el sistema para la clave.

El valor de key_name no debe comenzar con un número y no debe tener el formato __*__. Si tu aplicación usa datos enviados por los usuarios como nombres de clave para entidades de almacén de datos (como una dirección de correo electrónico), primero la aplicación debería limpiar el valor, por ejemplo, mediante el agregado de un prefijo con una string conocida como “key:”, para cumplir con estos requisitos.

Un key_name se almacena como una string de Unicode, con valores str convertidos en texto ASCII.

**kwds
Valores iniciales para las propiedades de la instancia, como argumentos de palabra clave. Cada nombre se corresponde con un atributo de la instancia nueva, y es posible que se corresponda con las propiedades fijas definidas en la clase Expando o que sean propiedades dinámicas.