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.
ExemploConsidere 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âmetroskwds: parâmetros de palavra-chave passados para Model.all.
RetornaConsulta com filtro definido de acordo com o discriminador dessa classe.
- classmethod class_key()source
Calcule a chave dessa classe.
RetornaChave 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.
RetornaNome 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âmetrosentity: entidade carregada diretamente do armazenamento de dados.
GeraKindError 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.
RetornaTipo 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.