A classe Expando

Observação: é altamente recomendável a desenvolvedores que criam novos aplicativos usar a biblioteca de cliente NDB, porque ela oferece diversos benefícios em comparação com a antiga biblioteca de cliente, como armazenamento em cache automático de entidades por meio da API Memcache. Se você estiver usando a antiga biblioteca de cliente DB, leia o Guia de migração de DB para NDB.

A classe Expando é uma superclasse para definições de modelo de dados com propriedades que são determinadas dinamicamente. O modelo Expando pode ter uma combinação de propriedades fixas semelhantes a Model e propriedades dinâmicas atribuídas a uma entidade durante a execução.

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

Expando é uma subclasse de Model e herda os métodos de classe e instância dessa classe. A classe Expando não define ou ignora qualquer método.

Introdução

Um modelo Expando pode ter propriedades fixas e dinâmicas. As propriedades fixas se comportam de maneira semelhante às propriedades de um Model e são definidas de maneira semelhante na classe de modelo Expando usando os atributos de classe. As propriedades dinâmicas são criadas quando recebem valores da instância. Duas instâncias da mesma classe Expando podem ter conjuntos diferentes de propriedades dinâmicas e podem até mesmo ter propriedades dinâmicas com o mesmo nome, mas com tipos diferentes. As propriedades dinâmicas são sempre opcionais e não têm valor padrão. Elas não existem até receberem um valor.

As propriedades dinâmicas não podem usar instâncias de Property para executar a validação, definir padrões ou aplicar lógica automática a valores. As propriedades dinâmicas simplesmente armazenam valores dos tipos compatíveis com o armazenamento de dados. Consulte Tipos e classes de propriedade.

Diferente das propriedades fixas, as propriedades dinâmicas não podem usar um nome distinto para o atributo de classe e o nome da propriedade do armazenamento de dados. Consulte Nomes de propriedade não permitidos.

Dica: se você quiser validar um valor de propriedade dinâmica usando uma classe Property, instancie essa classe e chame o método validate() no valor.

Uma subclasse Expando pode definir propriedades fixas semelhantes a uma classe Model. As propriedades fixas de Expando se comportam de um modo semelhante às propriedades de Model. Uma instância de 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) da instância de Expando podem ser excluídas. Para excluir uma propriedade dinâmica, o aplicativo exclui o atributo da instância:

del crazy.last_minute_note

Construtor

O construtor da classe Expando é definido como é mostrado abaixo:

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

Uma classe de modelo com propriedades que não precisam ser definidas na classe antes do uso. Assim como Model, a classe Expando precisa ter uma subclasse para definir o tipo das entidades de dados.

Expando é uma subclasse de Model e herda ou modifica os métodos dela.

Argumentos

parent
A instância de Model ou Key da entidade pai da nova entidade.
key_name

O nome da nova entidade. Ele se torna parte da chave primária. Se for None, é usado um ID gerado pelo sistema para a chave.

O valor de key_name não pode começar com um número nem ter o formato __*__. Se o aplicativo usar dados enviados pelo usuário como nomes de chave de entidade do armazenamento de dados (como um endereço de e-mail), o aplicativo precisará limpar o valor primeiro, por exemplo, prefixando-o com uma string conhecida como "key:" para atender a esses requisitos.

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

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