Mis favoritos | Español | Acceder

La clase Model

La clase Model es la superclase que permite definir modelos de datos.

La clase Model se proporciona a través del módulo google.appengine.ext.db.

Introducción

Una aplicación define un modelo de datos mediante la definición de una clase derivada de Model. Las propiedades del modelo se definen a través de atributos de clase e instancias de la clase Property. Por ejemplo:

class Story(db.Model):
  title = db.StringProperty()
  body = db.TextProperty()
  created = db.DateTimeProperty(auto_now_add=True)

Una aplicación crea una entidad de datos nueva mediante la creación de una instancia de una subclase de la clase Model. Las propiedades de una entidad se pueden asignar mediante atributos de la instancia o argumentos de palabra clave al constructor.

s = Story()
s.title = "The Three Little Pigs"

s = Story(title="The Three Little Pigs")

El nombre de la subclase del modelo se utiliza como nombre del tipo de entidad del almacén de datos. Los nombres de los atributos se utilizan como nombres de las propiedades correspondientes de una entidad. Los atributos de las instancias del modelo cuyos nombres comiencen por un carácter de subrayado (_) se ignorarán, por lo que tu aplicación podrá utilizar dichos atributos para almacenar datos en una instancia del modelo que no se haya guardado en el almacén de datos.

El almacén de datos y el API de la clase Model imponen varias restricciones en los nombres de propiedades y los atributos de las instancias del modelo. Para obtener una descripción completa, consulta Nombres de propiedades no permitidos.

Una entidad de datos puede tener una entidad principal opcional. Las relaciones principal-secundario componen grupos de entidades, que se utilizan para controlar las transacciones y las ubicaciones de datos del almacén de datos. Una aplicación crea una relación principal-secundario entre dos entidades mediante la transmisión de la entidad principal al constructor de la entidad secundaria, como argumento parent. Para obtener más información sobre entidades principales y ancestros, consulta Claves y grupos de entidades.

Cada entidad tiene una clave, un identificador único que representa la unidad. Una entidad puede tener un nombre de clave opcional, una cadena única entre todas las entidades del tipo determinado. El nombre y el tipo de la entidad se pueden utilizar con los métodos Key.from_path() y Model.get_by_key_name() para recuperar la entidad. Para obtener más información sobre las claves, consulta Claves y grupos de entidades.

El método Model.get_or_insert() se puede utilizar para recuperar una entidad que puede no existir, creándola en el almacén de datos si fuera necesario:

keyname = "some_key"
s = Story.get_or_insert(keyname, title="The Three Little Pigs")

Nota: una instancia de Model no tiene una entidad correspondiente en el almacén de datos hasta que se ejecuta el método put() por primera vez, de forma explícita o a través de Model.get_or_insert().

La clase Model se proporciona a través del paquete google.appengine.ext.db.

Constructor

El constructor de la clase Model se define del siguiente modo:

class Model(parent=None, key_name=None, **kw)

Superclase para definir modelos de datos.

Argumentos:

parent
La instancia de Model o la instancia de Key para la entidad que representa la entidad principal de la nueva entidad.
key_name

El nombre de la nueva entidad. El nombre forma parte de la clave principal. Si es igual a None, se utilizará una ID generada por el sistema como clave.

El valor de key_name no debe comenzar por un número y no debe tener el formato __*__. Si tu aplicación utiliza datos enviados por el usuario como nombres de claves de entidades del almacén de datos (por ejemplo, una dirección de correo electrónico), la aplicación deberá depurar el valor en primer lugar. Una forma de hacerlo sería, por ejemplo, añadirle una cadena conocida como prefijo, como "key:", que cumpla estos requisitos.

key_name se almacena como una cadena de Unicode, con los valores str convertidos a texto ASCII.

**kw
Valores iniciales de las propiedades de la instancia, como argumentos de palabra clave. Cada nombre corresponde a un atributo definido en la clase Model.

Métodos de clase

La clase Model proporciona los siguientes métodos de clase:

Model.get(keys)

Obtiene la instancia (o instancias) del modelo para los objetos Key determinados. Las claves deben representar entidades del tipo de modelo. Si una clave proporcionada no es del tipo correcto, se generará un error KindError.

Este método se parece a la función db.get(), pero dispone de una comprobación de tipos adicional.

Argumentos:

keys
Un objeto Key o una lista de objetos Key. También puede ser una versión de una cadena de un objeto Key o una lista de cadenas.
Model.get_by_id(ids, parent=None)

Obtiene la instancia (o instancias) del modelo para las ID numéricas determinadas.

Argumentos:

ids
Una ID de entidad numérica o una lista de ID de entidades numéricas.
parent
La entidad principal de las entidades solicitadas, como una instancia Model o Key, o None (el valor predeterminado) si las entidades solicitadas no tienen una entidad principal. Varias entidades solicitadas por una misma llamada deben tener la misma entidad principal.

Si ids es una cadena que representa un nombre, el método devolverá la instancia del modelo del nombre, o None si la entidad no existe. Si ids es una lista, el método devolverá una lista de instancias del modelo, con un valor None cuando no exista ninguna unidad para una entidad Key correspondiente.

Model.get_by_key_name(key_names, parent=None)

Obtiene la instancia (o instancias) del nombre (o los nombres ) de clave determinado.

Argumentos:

key_names
Un nombre de clave o una lista de nombres de claves.
parent
La entidad principal de las entidades solicitadas, como una instancia Model o Key, o None (el valor predeterminado) si las entidades solicitadas no tienen una entidad principal. Varias entidades solicitadas por una misma llamada deben tener la misma entidad principal.

Si key_names es una cadena que representa un nombre, el método devolverá la instancia del modelo del nombre, o None si la entidad no existe. Si key_names es una lista, el método devolverá una lista de instancias del modelo, con un valor None cuando no exista ninguna unidad para una entidad Key correspondiente.

Model.get_or_insert(key_name, **kwds)

Obtiene o crea una entidad del tipo del modelo con el nombre de clave determinado, mediante una única transacción. La transacción garantiza que si dos usuarios intentan obtener o introducir la entidad con el nombre determinado a la vez, ambos usuarios tendrán una instancia del modelo que hará referencia a la entidad, independientemente de qué proceso la haya creado.

Argumentos:

key_name
El nombre de la clave de la entidad.
**kwds
Los argumentos de palabra clave para transmitir la clase Model si una instancia con el nombre de clave especificado no existe. El argumento parent es necesario si la entidad deseada tiene una entidad principal.

El método devuelve una instancia de la clase Model que representa la entidad solicitadas, independientemente de que esta exista o la haya creado el método. Como ocurre con todas las operaciones del almacén de datos, este método puede generar un error TransactionFailedError si la transacción no logra completarse.

Model.all()

Devuelve un objeto Query que representa todas las entidades del tipo correspondiente a este modelo. Los métodos del objeto Query pueden aplicar filtros y criterios de ordenación a la consulta antes de su ejecución. Para obtener más información, consulta Query.

Model.gql(query_string, *args, **kwds)

Realiza una consulta GQL sobre las instancias de este modelo.

Argumentos:

query_string
La parte de la consulta GQL que sigue a SELECT * FROM model (que está establecida por el uso de este método de clase).
*args
Enlaces de parámetros posicionales, similares al constructor GqlQuery.
**kw
Enlaces de parámetros posicionales, similares al constructor GqlQuery.
s = Story.gql("WHERE title = :1", "Little Red Riding Hood")

s = Story.gql("WHERE title = :title", title="Little Red Riding Hood")

El valor devuelto es un objeto GqlQuery, que se puede utilizar para acceder a los resultados.

Model.kind()
Devuelve el tipo del modelo, por lo general el nombre de la subclase Model.
Model.properties()
Devuelve un diccionario de todas las propiedades definidas para esta clase de modelo.

Métodos de instancia

Las instancias del modelo tienen los siguientes métodos:

key()

Devuelve el almacén de datos Key para esta instancia del modelo.

Una instancia del modelo no tiene una clave hasta que se ejecuta el método put() en el almacén de datos. Si se ejecuta key() antes de que la instancia tenga una clave, se generará un error NotSavedError.

put()

Almacena la instancia del modelo en el almacén de datos. Si la instancia del modelo se acaba de crear y no se ha almacenado nunca, este método creará una nueva entidad de datos en el almacén de datos. Si no, actualizará la entidad de datos con los valores de propiedad actual.

El método devuelve el objeto Key de la entidad almacenada.

delete()

Elimina la instancia del modelo del almacén de datos. Si en la instancia no se ha ejecutado nunca el método put(), la eliminación no tendrá ningún efecto.

is_saved()

Devuelve True si en la instancia del modelo se ha ejecutado el método put() dentro del almacén de datos al menos una vez.

Este método sólo comprueba que la instancia se haya almacenado al menos una vez desde su creación. No comprueba si las propiedades de la instancia se han actualizado desde la última vez que se ejecutó el método put().

dynamic_properties()

Devuelve una lista de los nombres de todas las propiedades dinámicas definidas para la instancia del modelo. Sólo se aplica a las instancias de las clases Expando. En el caso de las instancias del modelo que no sean Expando, devolverá una lista vacía.

parent()

Devuelve una instancia del modelo para la entidad principal de esta instancia, o None si esta instancia no tiene una entidad principal.

parent_key()

Devuelve el objeto Key de la entidad principal de esta instancia, o None si esta instancia no tiene una entidad principal.

to_xml()

Devuelve una representación XML de la instancia del modelo.

Los valores de propiedad cumplen las especificaciones de Atom y GData.

Nombres de propiedades no permitidos

El almacén de datos y su API imponen varias restricciones en los nombres de las propiedades de la entidad y los atributos de las instancias de modelos.

El almacén de datos reserva todos los nombres de propiedades que comienzan y terminan con dos caracteres de subrayado (__*__). La entidad del almacén de datos tiene una propiedad con dicho nombre.

El API de modelos Python ignora todos los atributos de una clase Model o Expando que comienza por un carácter de subrayado (_). Tu aplicación puede utilizar estos atributos para asociar datos a los objetos del modelo que no se hayan guardado en el almacén de datos.

Por último, el API de modelos Python utiliza atributos de objeto para definir las propiedades de un modelo y, de forma predeterminada, las propiedades de las entidades del almacén de datos se denominan después de los atributos. Dado que la clase Model tiene varias propiedades y métodos destinados a otros fines, estos atributos no se pueden utilizar para las propiedades del API de Python. Por ejemplo, una clase Model no puede tener una propiedad a la que se acceda a través del atributo key.

No obstante, una propiedad puede especificar un nombre para el almacén de datos distinto al nombre del atributo. Para ello es necesario proporcionar un argumento name al constructor de la propiedad. Esto permite que la entidad del almacén de datos tenga un nombre de propiedad similar a un atributo reservado en la clase Model y utilice un nombre de atributo distinto en la clase.

class MyModel(db.Model):
  obj_key = db.StringProperty(name="key")

Los nombres de atributo que aparecen a continuación están reservados por la clase Model en el API de Python:

  • all
  • app
  • copy
  • delete
  • entity
  • entity_type
  • fields
  • from_entity
  • get
  • gql
  • instance_properties
  • is_saved
  • key
  • key_name
  • kind
  • parent
  • parent_key
  • properties
  • put
  • setdefault
  • to_xml
  • update