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 anterior de la base de datos, lee la Guía de migración de la base de datos a NDB.
La clase Property es la superclase de las definiciones de propiedad para modelos de datos. Una clase Property define el tipo de valor de una propiedad, cómo se validan los valores y cómo estos se almacenan en el almacén de datos.
El módulo google.appengine.ext.db
proporciona Property
.
Introducción
Una clase de propiedad describe el tipo de valor, el valor predeterminado, la lógica de validación y otras características de la propiedad de un Model. Cada clase es una subclase de la clase Property. La API del almacén de datos incluye clases de propiedad por cada tipo de valor del almacén de datos y otras que proporcionan características adicionales además de los tipos del almacén de datos. Consulta Tipos y clases Property.
Una clase de propiedad puede aceptar la configuración de argumentos que pasaron al constructor. El constructor de la clase básica admite varios argumentos que por lo general son admitidos en todas las clases de propiedad, incluidos aquellos proporcionados en la API de Datastore. Esta configuración puede incluir un valor predeterminado, uno explícito en caso de ser obligatorio, una lista de valores aceptables y la lógica de validación personalizada. Consulta la documentación sobre un tipo de propiedad específico para obtener más información sobre la configuración de la propiedad.
Una clase de propiedad define el modelo para una propiedad del almacén de datos. No contiene el valor de propiedad para una instancia de modelo. Las instancias de la clase Property pertenecen a la clase Model, no a las instancias de la clase. En términos de Python, las instancias de la clase Property son “descriptores” que permiten personalizar el comportamiento de los atributos de Model. Consulta la documentación de Python para obtener más información sobre los descriptores.
Constructor
El constructor de la clase básica Property se define de la manera siguiente:
- class Property(verbose_name=None, name=None, default=None, requiredFalse, validator=None, choices=None, indexed=True)
-
La superclase de definiciones de propiedad de los modelos.
Argumentos
- verbose_name
- Un nombre de propiedad fácil de usar. Este siempre debe ser el primer argumento para un constructor de propiedad. La biblioteca
djangoforms
lo usa para crear las etiquetas de los campos del formulario y otras pueden usarlo con propósitos similares. - name
- El nombre de almacenamiento para la propiedad, usado en consultas. Esto establece de manera predeterminada el nombre del atributo que se usa para la propiedad. Debido a que las clases modelo tienen atributos diferentes de las propiedades (que no se pueden usar para las propiedades), una propiedad puede usar name a fin de usar un nombre de atributo reservado como nombre de la propiedad en el almacén de datos y usar uno diferente para el atributo de la propiedad. Consulta Nombres de propiedades no permitidos para obtener más información.
- predeterminada
-
Un valor predeterminado para la propiedad. Se considera que el valor es el predeterminado si al valor de la propiedad no se le asigna nunca un valor o si se le da el de
None
.Nota: Las definiciones de la clase modelo se almacenan en la caché con el resto de los códigos de la aplicación. Esto incluye el almacenamiento en la caché de valores predeterminados para las propiedades. No establezca un valor predeterminado en la definición del modelo con datos específicos de la solicitud (como
users.get_current_user()
). En su lugar, define un método__init__()
para la clase Model que inicializa los valores de la propiedad. - Obligatorio
-
Si es
True
, la propiedad no puede tener un valor deNone
. Una instancia de modelo debe inicializar todas las propiedades obligatorias en su constructor para que no se cree una instancia con valores faltantes. Si se intenta crear una instancia sin inicializar una propiedad obligatoria o se intenta asignarNone
a una propiedad de este tipo, se generará un error BadValueError.Una propiedad que es obligatoria y tiene un valor predeterminado, usa el valor predeterminado si no se le da uno en el constructor. Sin embargo, no se le puede asignar a la propiedad un valor de
None
y no hay forma automática de restablecer el valor predeterminado después de asignar otro valor. Puedes acceder al atributodefault
de la propiedad para obtener este valor y asignarlo de manera explícita. - validador
- Una función a la que se debe llamar para validar el valor de la propiedad cuando se asigne. La función toma el valor como su único argumento y genera una excepción si el valor no es válido. Se llama al validador específico después de que se realiza otra validación, como la de verificar que una propiedad obligatoria tenga un valor. Cuando no se le da un valor a una propiedad obligatoria, se le llama al validador con el argumento
None
. - choices
- Una lista de valores aceptables para la propiedad. Si ya está establecida, no se le podrá asignar a la propiedad un valor que no esté en la lista. Como con la validación obligatoria y otras, una instancia de modelo debe inicializar todas las propiedades con elecciones para que no se cree una instancia con valores no válidos. Si las elecciones son
None
, entonces serán aceptables todos los valores que aprueben la validación. - indexed
-
Si esta propiedad debe incluirse en los índices integrados y definidos por desarrolladores. Si
False
, las entidades escritas en el almacén de datos nunca ser mostrarán en las consultas que ordenan o filtran en esta propiedad, similares a las propiedades Blob y Text.Nota: Cada propiedad indexada agrega una pequeña cantidad de sobrecarga, costo de CPU y latencia a las llamadas
put()
ydelete()
. Si nunca necesitarás ordenar ni filtrar en una propiedad, considera usarindexed=False
para evitar esa sobrecarga. Sin embargo, ten cuidado con lo siguiente. Si luego quieres indexar la propiedad, cambiarla de nuevo aindexed=True
solo afectará a las escrituras desde ese momento en adelante. Las entidades que originalmente se escribieron conindexed=False
no se volverán a indexar.
Atributos de clase
Las subclases de la clase Property definen el siguiente atributo de clase:
data_type
- El tipo o clase de datos de Python que la propiedad acepta como valor nativo de Python.
Métodos de instancia
Las instancias de las clases Property tienen los siguientes métodos:
- default_value()
-
Muestra el valor predeterminado de la propiedad. La implementación básica usa el valor del argumento predeterminado proporcionado al constructor. Una clase propiedad puede anular esto para proporcionar un comportamiento especial del valor predeterminado, como con la función auto_now de DateTimeProperty.
- validate(value)
-
La rutina de validación completa para la propiedad. Si el valor es válido, lo mostrará, ya sea sin modificaciones o adaptado al tipo obligatorio. De otra manera, mostrará una excepción adecuada.
La implementación básica verifica que el valor no sea
None
si es obligatorio (el argumento obligatorio para el constructor básico Property), que el valor sea una de las elecciones válidas si la propiedad se configuró con elecciones (el argumento elecciones) y que el validador personalizado (el argumento validador) si lo hay, apruebe el valor.Se llama a la rutina de validación cuando se crea una instancia para un modelo que usa el tipo de propiedad (con valores predeterminados o inicializados) y cuando a una propiedad del tipo se le asigna un valor. La rutina no debe tener efectos secundarios.
- empty(value)
-
Muestra
True
si value se considera vacío para este tipo de propiedad. La implementación básica es equivalente anot value
, que es suficiente para la mayoría de los tipos. Otros tipos, como el booleano, pueden anular este método con una prueba más adecuada. - get_value_for_datastore(model_instance)
-
Muestra el valor que se debe guardar en el almacén de datos para esta propiedad en la instancia de modelo especificada. La implementación básica solo muestra el valor nativo de Python de la propiedad en la instancia del modelo. Una clase propiedad puede anular esto con el fin de usar, para el almacén de datos, un tipo de dato diferente al de la instancia del modelo o de realizar otra conversión de datos justo antes de almacenar esta instancia.
- make_value_from_datastore(value)
-
Muestra la representación nativa de Python para el valor específico desde el almacén de datos. La implementación básica solo muestra el valor. Una clase Property puede anular esto con el fin de usar para la instancia de modelo un tipo de datos diferente al del almacén de datos
- make_value_from_datastore_index_value(value)
-
Muestra la representación nativa de Python para el valor específico desde el índice del almacén de datos. La implementación básica solo muestra el valor. Una clase Property puede anular esto con el fin de usar para la instancia de modelo un tipo de datos diferente al del almacén de datos