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

Resumo

Modelos e consultas polimórficos.

A classe padrão do modelo NDB é compatível apenas com o "polimorfismo funcional". Ou seja, é possível criar uma subclasse de Model e subclasses dessa classe, quantas gerações forem necessárias, e essas classes compartilharão todas as mesmas propriedades e comportamentos de suas classes base. No entanto, a criação de uma subclasse de Model dessa maneira dá a cada subclasse seu próprio tipo. Isso significa que não é possível fazer "consultas polimórficas". Construir uma consulta em uma classe base só retornará entidades com um tipo que corresponde ao tipo da classe base e exclua entidades que sejam instâncias de alguma subclasse dessa classe base.

A classe PolyModel definida aqui permite criar hierarquias de classes que são compatíveis com consultas polimórficas. Basta criar uma subclasse de PolyModel e não de Model.

Conteúdo

class google.appengine.ext.ndb.polymodel.PolyModel(*args, **kwds)source

Bases: google.appengine.ext.ndb.model.Model

Classe base para hierarquias de classes compatíveis com consultas polimórficas.

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

Exemplo

Considere a seguinte hierarquia de modelos:

+------+
|Animal|
+------+
  |
  +-----------------+
  |                 |
+------+          +------+
|Canine|          |Feline|
+------+          +------+
  |                 |
  +-------+         +-------+
  |       |         |       |
+---+   +----+    +---+   +-------+
|Dog|   |Wolf|    |Cat|   |Panther|
+---+   +----+    +---+   +-------+

Essa hierarquia de classes tem três níveis. A primeira é a "classe raiz". Todos os modelos em uma única hierarquia de classes precisam ser herdados dessa raiz. Todos os modelos na hierarquia são armazenados do mesmo tipo da classe raiz. Por exemplo, as entidades Panther quando no Cloud Datastore são do tipo "Animal". Consultar o tipo Animal recuperará Cats, Dogs e Canines, 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 Cloud Datastore, 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 Cloud Datastore 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 Cloud Datastore, 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 em qualquer sub-hierarquia. Por exemplo, para buscar apenas objetos Canine, inclusive todos os Dogs e Wolves:

Canine.query()

A propriedade "class" não precisa ser usada pelo código para finalidades que não sejam consultas. Como é necessário representar a classe real do Python, ela precisa ser ocultada da visualização. Mesmo que você sinta a necessidade, ela é acessível como o atributo "class_".

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 filha imediata de PolyModel. As subclasses da classe raiz são todas do mesmo tipo que a classe raiz. Resumindo:

Animal.kind() == Feline.kind() == Panther.kind() == 'Animal'
class_

Propriedade para armazenar a "chave de classe" de uma classe polimórfica.

A chave de classe é uma lista de strings que descrevem o lugar de uma entidade polimórfica dentro da hierarquia de classes. Essa propriedade é calculada automaticamente. Por exemplo:

class Foo(PolyModel): ...
class Bar(Foo): ...
class Baz(Bar): ...

Foo().class_ == ['Foo']
Bar().class_ == ['Foo', 'Bar']
Baz().class_ == ['Foo', 'Bar', 'Baz']
Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Ambiente padrão do App Engine para Python 2