Nota: Se recomienda encarecidamente a los desarrolladores que creen aplicaciones nuevas que usen la biblioteca de cliente de NDB, que ofrece varias ventajas en comparación con esta biblioteca de cliente, como el almacenamiento automático en caché de entidades mediante la API Memcache. Si actualmente usas la biblioteca de cliente de DB anterior, consulta la guía de migración de DB a NDB.
La clase Expando es una superclase de definiciones de modelos de datos cuyas propiedades se determinan de forma dinámica. Un modelo Expando puede tener una combinación de propiedades fijas similares a Model y propiedades dinámicas asignadas a una entidad en tiempo de ejecución.
Expando
lo proporciona el módulo google.appengine.ext.db
.
Expando es una subclase de Model y hereda sus métodos de clase y de instancia de esa clase. La clase Expando no define ni sobrescribe ningún método.
Introducción
Un modelo Expando puede presentar propiedades fijas y propiedades dinámicas. Las propiedades fijas se comportan de forma similar a las propiedades de un modelo y se definen de forma similar en la clase de modelo Expando mediante atributos de clase. Las propiedades dinámicas se crean cuando se les asignan valores en la instancia. Dos instancias de la misma clase Expando pueden incluir distintos conjuntos de propiedades dinámicas e incluso pueden contener propiedades dinámicas con el mismo nombre y distinto tipo. Las propiedades dinámicas siempre son opcionales y no tienen ningún valor predeterminado: no existen hasta que se les asigna un valor.
Las propiedades dinámicas no pueden usar instancias de Property para realizar validaciones, definir valores predeterminados o aplicar lógica automática a los valores. Las propiedades dinámicas únicamente almacenan valores de los tipos de almacenes de datos compatibles. Consulta Tipos y clases de propiedades.
A diferencia de las propiedades fijas, las propiedades dinámicas no pueden utilizar un nombre distinto para el nombre de propiedad de almacén de datos y el atributo de clase. Consulta Nombres de propiedad no permitidos.
Nota: Si quiere validar un valor de propiedad dinámica mediante una clase Property, puede crear una instancia de la clase Property y llamar a su método validate() en el valor.
Una subclase Expando puede definir propiedades fijas similares a una clase Model. Las propiedades fijas de una clase Expando se comportan de forma similar a las propiedades de una clase Model. Una instancia de Expando puede presentar tanto propiedades fijas como 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.')
Se pueden eliminar las propiedades dinámicas (no fijas) de una instancia de Expando. Para eliminar una propiedad dinámica, una aplicación elimina el atributo de la instancia:
del crazy.last_minute_note
Constructor
El constructor de la clase Expando se define del siguiente modo:
- class Expando(parent=None, key_name=None, **kwds)
-
Una clase de modelo cuyas propiedades no se tienen que definir en la clase antes de su uso. Al igual que 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 de Model o de Key de la entidad que es el elemento superior de la nueva entidad.
- key_name
-
El nombre de la nueva entidad. El nombre forma parte de la clave principal. Si
None
, se usa un ID generado por el sistema para la clave.El valor de key_name no debe empezar por un número ni tener el formato
__*__
. Si tu aplicación usa datos enviados por los usuarios como nombres de clave de entidad de Datastore (por ejemplo, una dirección de correo electrónico), la aplicación debe sanear el valor primero, por ejemplo, añadiéndole un prefijo con una cadena conocida como "key:", para cumplir estos requisitos.Un
key_name
se almacena como una cadena Unicode, con los valoresstr
convertidos como texto ASCII. - **kwds
- Valores iniciales de las propiedades de la instancia, como argumentos de palabras clave. Cada nombre se corresponde con un atributo de la nueva instancia y puede corresponderse con propiedades fijas definidas en la clase Expando o con propiedades dinámicas.