Módulo google.appengine.ext.db.polymodel

Resumo

Suporte para modelos e consultas polimórficas.

A classe Model propriamente dita é capaz de dar suporte ao polimorfismo funcional. É possível criar uma subclasse Model e uma subclasse de muitas gerações conforme necessário, e essas classes compartilharão todas as mesmas propriedades e comportamentos. O problema é que a subclasse Model dessa maneira coloca cada subclasse no próprio tipo. Isso significa que não é possível fazer consultas polimórficas. A criação de uma consulta em uma classe base só retornará instâncias dessa classe do Datastore, e as consultas em uma subclasse só retornarão essas instâncias.

Esse módulo permite que aplicativos especifiquem hierarquias de classes compatíveis com consultas polimórficas.

Índice

class google.appengine.ext.db.polymodel.PolyModel(parent=None, key_name=None, _app=None, _from_entity=False, **kwds)source

Bases: google.appengine.ext.db.Model

Classe base para modelos compatíveis com consultas polimórficas.

Use essa classe para criar hierarquias que possam ser consultadas com base nos tipos.

Exemplo

Considere a seguinte hierarquia de modelo:

Animal

+——+ +——+ |Canine||Feline| +——+ +——+

|

+——-+ +——-+ | | | |

+—+ +—-+ +—+ +——-+ |Dog||Wolf||Cat||Panther| +—+ +—-+ +—+ +——-+

Essa hierarquia de classes tem três níveis. O primeiro é a "classe raiz". Todos os modelos em uma única hierarquia de classes precisam herdar dessa raiz. Todos os modelos na hierarquia são armazenados do mesmo tipo da classe raiz. Por exemplo, as entidades Panther quando armazenadas no repositório de dados são do tipo "Animal". Consultar o tipo de animal recuperará gatos, cachorros e caninos, por exemplo, que correspondem à sua consulta. As classes diferentes armazenadas no tipo da classe raiz são identificadas pela chave de classe. Quando carregado pelo armazenamento de dados, ele é mapeado para a classe de implementação apropriada.

Propriedades polimórficas:

As propriedades definidas em uma determinada classe base dentro de uma hierarquia são mantidas no armazenamento de dados apenas para todas as subclasses. Então, se a classe Feline tivesse uma propriedade chamada "whiskers", as entidades Cat e Panther também teriam whiskers, e não Animal, Canine, Dog ou Wolf.

Consultas polimórficas:

Quando gravados no armazenamento de dados, todos os objetos polimórficos têm automaticamente uma propriedade chamada "classe" que você pode consultar. Usando-se essa propriedade, é possível escrever facilmente uma consulta GQL em qualquer sub-hierarquia. Por exemplo, para buscar apenas objetos Canine, inclusive todos os Dogs e Wolves:

db.GqlQuery(“SELECT * FROM Animal WHERE class=’Canine’”)

E o método alternativo é usar os métodos "all" ou "gql" da classe Canine:

Canine.all() Canine.gql(‘’)

A propriedade "class" não precisa ser usada pelo código além de consultas. Como precisa representar a classe real do Python, ela precisa ser ocultada da visualização.

Classe raiz:

Classe raiz é a classe da qual todas as outras classes da hierarquia são herdadas. Cada hierarquia tem uma única classe raiz. Uma classe será uma classe raiz se for filho imediato de PolyModel. As subclasses da classe raiz são todas do mesmo tipo que a classe raiz. Em outras palavras:

Animal.kind() == Feline.kind() == Panther.kind() == ‘Animal’

classmethod all(**kwds)source

Receba todas as instâncias de uma hierarquia de classes.

Parâmetros

kwds: parâmetros de palavra-chave passados para Model.all.

Retorna

Consulta com filtro definido de acordo com o discriminador dessa classe.

classmethod class_key()source

Calcule a chave dessa classe.

Retorna

Chave de classe. Por padrão, esta é uma lista de classes da hierarquia, que começa pela classe raiz e vai até cls.

classmethod class_name()source

Calcule o nome dessa classe.

Retorna o nome a ser usado para cada elemento de classe dentro da chave de classe. Usado para discriminar classes diferentes dentro do tipo Datastore da hierarquia de classes.

A presença desse método permite que os desenvolvedores usem um nome de classe diferente no armazenamento de dados do que é usado no código Python. Isso é útil, por exemplo, para renomear classes sem precisar migrar instâncias já gravadas no armazenamento de dados. Por exemplo, para renomear uma classe polimórfica Contact para SimpleContact, você poderia converter:

# A chave de classe é [‘Information’] class Information(PolyModel): …

# A chave de classe é [‘Information’, ‘Contact’] class Contact(Information): …

para:

# A chave de classe ainda é [‘Information’, ‘Contact’] class SimpleContact(Information):

… @classmethod def class_name(cls):

return ‘Contact’

# A chave de classe é [‘Information’, ‘Contact’, ‘ExtendedContact’] class ExtendedContact(SimpleContact): …

Isso garante que todos os objetos gravados anteriormente com o uso do nome da classe anterior sejam carregados.

Retorna

Nome dessa classe.

classmethod from_entity(entity)source

Carregado de entidade para classe com base no discriminador.

Em vez de instanciar uma nova instância Model com base no mapeamento de tipo, ele cria uma instância da classe de modelo correta com base na chave de classe de entidades.

Parâmetros

entity: entidade carregada diretamente do armazenamento de dados.

Gera

KindError quando não há mapeamento de classe com base no discriminador.

classmethod gql(query_string, *args, **kwds)source

Retorna uma consulta polimórfica usando-se a string de consulta GQL.

Essa consulta é polimórfica porque tem filtros configurados de maneira a recuperar instâncias do modelo ou uma instância de uma subclasse do modelo.

Parâmetros
  • query_string: string de consulta GQL formatada corretamente com a parte "SELECT * FROM <entity>" omitida

  • *args: restante dos argumentos posicionais usados para vincular referências numéricas na consulta.

  • **kwds: argumentos baseados em dicionário (para parâmetros nomeados)

classmethod kind()source

Receba o tipo de modelo polimórfico.

Substituído de maneira que todas as subclasses de classes raiz sejam do mesmo tipo da raiz.

Retorna

Tipo de entidade a ser gravado no armazenamento de dados.

class google.appengine.ext.db.polymodel.PolymorphicClass(name, bases, dct)source

Bases: google.appengine.ext.db.PropertiedClass

Metaclasse para inicializar PolymorphicClasses.

Essa classe estende PropertiedClass para adicionar alguns atributos estáticos a novas classes polimórficas necessárias para o funcionamento correto delas.