A classe Expando

Nota: os programadores que criam novas aplicações são fortemente aconselhados a usar a biblioteca de cliente NDB, que tem várias vantagens em comparação com esta biblioteca de cliente, como o armazenamento em cache automático de entidades através da API Memcache. Se estiver a usar atualmente a biblioteca cliente DB mais antiga, leia o guia de migração de DB para NDB

A classe Expando é uma superclasse para definições de modelos de dados cujas propriedades são determinadas dinamicamente. Um modelo Expando pode ter uma combinação de propriedades fixas semelhantes a Model e propriedades dinâmicas atribuídas a uma entidade no momento da execução.

O Expando é fornecido pelo módulo google.appengine.ext.db.

O Expando é uma subclasse de Model e herda os respetivos métodos de classe e de instância dessa classe. A classe Expando não define nem substitui nenhum método.

Introdução

Um modelo Expando pode ter propriedades fixas e propriedades dinâmicas. As propriedades fixas comportam-se de forma semelhante às propriedades de um modelo e são definidas de forma semelhante na classe de modelo Expando através de atributos de classe. As propriedades dinâmicas são criadas quando lhes são atribuídos valores na instância. Duas instâncias da mesma classe Expando podem ter conjuntos diferentes de propriedades dinâmicas e podem até ter propriedades dinâmicas com o mesmo nome, mas tipos diferentes. As propriedades dinâmicas são sempre opcionais e não têm um valor predefinido: não existem até lhes ser atribuído um valor.

As propriedades dinâmicas não podem usar instâncias de Property para realizar a validação, definir predefinições ou aplicar lógica automática aos valores. As propriedades dinâmicas armazenam simplesmente valores dos tipos de armazenamento de dados suportados. Consulte o artigo Tipos e classes de propriedades.

Além disso, ao contrário das propriedades fixas, as propriedades dinâmicas não podem usar um nome diferente para o atributo de classe e o nome da propriedade da base de dados. Consulte a secção Nomes de propriedades não permitidos.

Sugestão: se quiser validar um valor de propriedade dinâmico através de uma classe de propriedade, pode instanciar a classe de propriedade e chamar o respetivo método validate() no valor.

Uma subclasse Expando pode definir propriedades fixas semelhantes a uma classe Model. As propriedades fixas de um Expando comportam-se de forma semelhante às propriedades de um Model. Uma instância Expando pode ter propriedades fixas e 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.')

As propriedades dinâmicas (não fixas) de uma instância Expando podem ser eliminadas. Para eliminar uma propriedade dinâmica, uma aplicação elimina o atributo da instância:

del crazy.last_minute_note

Construtor

O construtor da classe Expando é definido da seguinte forma:

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

Uma classe de modelo cujas propriedades não precisam de ser definidas na classe antes da utilização. Tal como Model, a classe Expando tem de ser uma subclasse para definir o tipo das entidades de dados.

O Expando é uma subclasse de Model e herda ou substitui os respetivos métodos.

Argumentos

parent
A instância do modelo ou a instância da chave para a entidade que é a principal da nova entidade.
key_name

O nome da nova entidade. O nome passa a fazer parte da chave principal. Se None, é usado um ID gerado pelo sistema para a chave.

O valor de key_name não pode começar por um número e não pode ter o formato __*__. Se a sua aplicação usar dados enviados pelo utilizador como nomes de chaves de entidades da base de dados (como um endereço de email), a aplicação deve limpar primeiro o valor, por exemplo, prefixando-o com uma string conhecida como "key:", para cumprir estes requisitos.

Um key_name é armazenado como uma string Unicode, com os valores str convertidos como texto ASCII.

**kwds
Valores iniciais para as propriedades da instância, como argumentos de palavras-chave. Cada nome corresponde a um atributo da nova instância e pode corresponder a propriedades fixas definidas na classe Expando ou a propriedades dinâmicas.