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

Resumo

MessageProperty: uma propriedade que armazena objetos Message ProtoRPC.

Uso básico:

Vamos supor que você tenha uma subclasse protorpc.messages.Message, como esta:

from protorpc import messages

classe Note(messages.Message):

text = messages.StringField(1, required=True) when = messages.IntegerField(2)

Agora, suponhamos que você queira armazenar Notes no Cloud Datastore. Crie uma classe de modelo para manter as observações da seguinte maneira:

from google.appengine.ext import ndb from google.appengine.ext.ndb import msgprop

class NoteStore(ndb.Model):

note = msgprop.MessageProperty(Note) name = ndb.StringProperty()

O nome da classe, 'NoteStore', e o nome da propriedade, 'note', estão à sua escolha.

Para armazenar uma mensagem Note, crie uma entidade NoteStore e a escreva:

ns = NoteStore(note=my_note, name=’foo’) key = ns.put()

Para recuperar Note depois, releia a entidade NoteStore:

ns = key.get() my_note = ns.note

A classe MessageProperty tem muitas das opções Property comuns:
  • name: nome do armazenamento de dados opcional

  • repeated: caso True, armazena uma lista de valores de mensagem

  • required: caso True, o valor da mensagem não pode ser None

  • default: valor da mensagem padrão opcional a ser armazenado

  • choices: lista opcional de escolhas permitidas (precisa ser sempre messages)

  • validator: função opcional para validar valores de mensagem

  • verbose_name: nome longo opcional para a propriedade

No entanto, MessageProperty não aceita a opção "indexed". Em vez disso, você pode especificar uma lista de nomes de campo que serão indexados, assim:

class MyStore(ndb.Model):

author = ndb.StringProperty() note = msgprop.MessageProperty(Note, indexed_fields=[‘text’, ‘when’])

Você já pode consultar valores de campo, como:

stores = MyStore.query(MyStore.note.when >= 123).fetch()

A semelhança com StructuredProperty: na verdade, MessageProperty é herdada de StructuredProperty. A principal diferença é que StructuredProperty usa uma subclasse Model em vez de uma subclasse protorpc.messages.Message, e StructuredProperty não indexa nenhum campo por padrão.

Ela também funciona com mensagens aninhadas (usando MessageField):

classe Notes(messages.Message):

notes = messages.MessageField(Note, 1, repeated=True)

classe MyNotesStore(ndb.Model):

author = ndb.StringProperty() foo = msgprop.MessageProperty(Notes,

indexed_fields=[‘notes.text, ‘notes.when’])

Com base nesse valor para indexed_fields, você também pode consultar subcampos neste exemplo:

stores = MyNoteStore.query(MyNoteStore.foo.notes.when < 123).fetch()

Uma opção final para MessageProperty é "protocol". Isso permite especificar como o objeto de mensagem é serializado para o Cloud Datastore. Os valores são nomes de protocolo usados pela classe protorpc.remote.Protocols. Os nomes de protocolo compatíveis são "protobuf" e "protojson". O padrão é "protobuf". No futuro, isso usará o registro de protocolos globais que está sendo adicionado ao protorpc. Depois disso, qualquer nome de protocolo registrado será aceitável.

Há também uma EnumProperty, que pode ser usada para armazenar um valor de messages.Enum sem encapsulá-la em um objeto Message. Exemplo:

classe Color(messages.Enum):

RED = 620 GREEN = 495 BLUE = 450

classe Part(ndb.Model):

name = ndb.StringProperty() color = msgprop.EnumProperty(Color, required=True)

p1 = Part(name=’foo’, color=Color.RED) key1 = p1.put() … p2 = key1.get() print p2.name, p2.color # prints “foo RED”

O EnumProperty armazena o valor como um inteiro. Na verdade, EnumProperty é uma subclasse de IntegerProperty. É útil saber disso, porque você pode renomear os valores de enum sem precisar modificar entidades já armazenadas, mas não é possível renumerá-las.

O EnumProperty aceita as seguintes opções padrão:
  • name

  • indexed

  • repeated

  • required

  • default

  • choices

  • validator

  • verbose_name

Índice

class google.appengine.ext.ndb.msgprop.MessageProperty(*args, **kwds)source

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

As mensagens são representadas no Cloud Datastore como propriedades estruturadas.

Por padrão, a propriedade estruturada tem uma única subpropriedade contendo a mensagem serializada. Essa propriedade é chamada "blob_" no Python, mas __<protocol>__ no Datastore, em que <protocol> é o valor do argumento de protocolo ("protobuf" padrão).

class google.appengine.ext.ndb.msgprop.EnumProperty(*args, **kwds)source

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

Enums são representados no Cloud Datastore como inteiros.

Menos amigável no visualizador do Datastore, mas que corresponde à representação de enums na serialização protobuf (mas não em JSON) e permite renomear os valores de enum sem exigir alterações em valores já armazenados no Datastore.