A classe Expando
Mantenha tudo organizado com as coleções
Salve e categorize o conteúdo com base nas suas preferências.
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 esta 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.
Exceto em caso de indicação contrária, o conteúdo desta página é licenciado de acordo com a Licença de atribuição 4.0 do Creative Commons, e as amostras de código são licenciadas de acordo com a Licença Apache 2.0. Para mais detalhes, consulte as políticas do site do Google Developers. Java é uma marca registrada da Oracle e/ou afiliadas.
Última atualização 2025-09-04 UTC.
[[["Fácil de entender","easyToUnderstand","thumb-up"],["Meu problema foi resolvido","solvedMyProblem","thumb-up"],["Outro","otherUp","thumb-up"]],[["Difícil de entender","hardToUnderstand","thumb-down"],["Informações incorretas ou exemplo de código","incorrectInformationOrSampleCode","thumb-down"],["Não contém as informações/amostras de que eu preciso","missingTheInformationSamplesINeed","thumb-down"],["Problema na tradução","translationIssue","thumb-down"],["Outro","otherDown","thumb-down"]],["Última atualização 2025-09-04 UTC."],[[["\u003cp\u003eDevelopers should prioritize the NDB Client Library over the older DB Client Library for new applications due to benefits like automatic entity caching.\u003c/p\u003e\n"],["\u003cp\u003eThe Expando class allows for the creation of entities with both fixed properties, similar to those in the Model class, and dynamic properties that are assigned at runtime.\u003c/p\u003e\n"],["\u003cp\u003eDynamic properties in Expando are optional, lack default values, and are created when they're assigned a value, and these properties do not support property classes or name aliasing.\u003c/p\u003e\n"],["\u003cp\u003eExpando instances can have a mix of fixed and dynamic properties, with the latter able to be deleted by removing the corresponding attribute from the instance.\u003c/p\u003e\n"],["\u003cp\u003eThe Expando constructor allows setting a parent, key name, and initial property values, supporting both fixed and dynamic properties through keyword arguments.\u003c/p\u003e\n"]]],[],null,["# The Expando Class\n\n**Note:**\nDevelopers building new applications are **strongly encouraged** to use the\n[NDB Client Library](/appengine/docs/legacy/standard/python/ndb), which has several benefits\ncompared to this client library, such as automatic entity caching via the Memcache\nAPI. If you are currently using the older DB Client Library, read the\n[DB to NDB Migration Guide](/appengine/docs/legacy/standard/python/ndb/db_to_ndb)\n\nThe Expando class is a superclass for data model definitions whose properties are determined dynamically. An Expando model can have a combination of fixed properties similar to [Model](/appengine/docs/legacy/standard/python/datastore/modelclass) and dynamic properties assigned to an entity at run-time.\n\n`Expando` is provided by the `google.appengine.ext.db` module.\n\nExpando is a subclass of [Model](/appengine/docs/legacy/standard/python/datastore/modelclass), and inherits its class and instance methods from that class. The Expando class does not define or override any methods.\n\nIntroduction\n------------\n\nAn Expando model can have fixed properties and dynamic properties. Fixed properties behave similar to properties of a [Model](/appengine/docs/legacy/standard/python/datastore/modelclass), and are similarly defined in the Expando model class using class attributes. Dynamic properties are created when they are assigned values on the instance. Two instances of the same Expando class can have different sets of dynamic properties, and can even have dynamic properties with the same name but different types. Dynamic properties are always optional, and have no default value: They don't exist until they are assigned a value.\n\nDynamic properties cannot use [Property](/appengine/docs/legacy/standard/python/datastore/propertyclass) instances to perform validation, set defaults or apply automatic logic to values. Dynamic properties simply store values of the supported datastore types. See [Types and Property Classes](/appengine/docs/legacy/standard/python/datastore/typesandpropertyclasses).\n\nAlso unlike fixed properties, dynamic properties cannot use a different name for the class attribute and the datastore property name. See [Disallowed Property Names](/appengine/docs/legacy/standard/python/datastore/modelclass#Disallowed_Property_Names).\n\n**Tip:** If you want to validate a dynamic property value using a Property class, you can instantiate the Property class and call its [validate()](/appengine/docs/legacy/standard/python/datastore/propertyclass#Property_validate) method on the value.\n\nAn Expando subclass can define fixed properties similar to a [Model](/appengine/docs/legacy/standard/python/datastore/modelclass) class. Fixed properties of an Expando behave similarly to properties of a Model. An Expando instance can have both fixed and dynamic properties. \n\n```python\nimport datetime\n\nfrom google.appengine.ext import db\n\nclass Song(db.Expando):\n title = db.StringProperty()\n\ncrazy = Song(title='Crazy like a diamond',\n author='Lucy Sky',\n publish_date='yesterday',\n rating=5.0)\n\nhoboken = Song(title='The man from Hoboken',\n author=['Anthony', 'Lou'],\n publish_date=datetime.datetime(1977, 5, 3))\n\ncrazy.last_minute_note=db.Text('Get a train to the station.')\n```\n\nAn Expando instance's dynamic (non-fixed) properties can be deleted. To delete a dynamic property, an application deletes the instance's attribute: \n\n```\ndel crazy.last_minute_note\n```\n\nConstructor\n-----------\n\nThe constructor of the Expando class is defined as follows:\n\nclass Expando(parent=None, key_name=None, \\*\\*kwds)\n\n: A model class whose properties do not need to be defined in the class before use. Like [Model](/appengine/docs/legacy/standard/python/datastore/modelclass), the Expando class must be subclassed to define the kind of the data entities.\n\n Expando is a subclass of [Model](/appengine/docs/legacy/standard/python/datastore/modelclass), and inherits or overrides its methods.\n\n Arguments\n\n parent\n : The Model instance or Key instance for the entity that is the new entity's parent.\n\n key_name\n\n : The name for the new entity. The name becomes part of the primary key. If `None`, a system-generated ID is used for the key.\n\n The value for key_name must not start with a number, and must not be of the form `__*__`. If your application uses user-submitted data as datastore entity key names (such as an email address), the application should sanitize the value first, such as by prefixing it with a known string like \"key:\", to meet these requirements.\n\n A `key_name` is stored as a Unicode string, with `str` values converted as ASCII text.\n\n \\*\\*kwds\n : Initial values for the instance's properties, as keyword arguments. Each name corresponds with an attribute of the new instance, and may either correspond with fixed properties defined in the Expando class, or be dynamic properties."]]