Die Expando-Klasse

Hinweis: Entwicklern von neuen Anwendungen wird dringend empfohlen, die NDB-Clientbibliothek zu verwenden. Diese bietet im Vergleich zur vorliegenden Clientbibliothek verschiedene Vorteile, z. B. das automatische Caching von Entitäten über die Memcache API. Wenn Sie derzeit die ältere DB-Clientbibliothek verwenden, finden Sie weitere Informationen im Leitfaden zur Migration von DB- zu NDB-Clientbibliotheken.

Bei der Expando-Klasse handelt es sich um eine übergeordnete Klasse für Datenmodelldefinitionen, deren Eigenschaften dynamisch bestimmt werden. Expando-Modelle können eine Kombination aus festen Properties wie in einem Modell und dynamischen Properties, die einer Entität zur Laufzeit zugewiesen werden, enthalten.

Expando wird vom Modul google.appengine.ext.db bereitgestellt.

Expando ist eine abgeleitete Klasse von Modell und übernimmt die Klassen- und Instanzmethoden dieser Klasse. Von der Expando-Klasse werden keine Methoden definiert oder überschrieben.

Einführung

Expando-Modelle können sowohl feste als auch dynamische Eigenschaften haben. Feste Properties verhalten sich ähnlich wie die Properties in einem Modell und werden in der Expando-Modellklasse mithilfe von Klassenattributen auch ähnlich definiert. Dynamische Eigenschaften werden erstellt, wenn diesen bei der Instanz Werte zugeordnet werden. Zwei Instanzen der gleichen Expando-Klasse können unterschiedliche dynamische Eigenschaften und sogar dynamische Eigenschaften mit gleichem Namen, jedoch unterschiedlichen Typen haben. Dynamische Eigenschaften sind immer optional und haben keinen Standardwert: Sie werden erst beim Zuweisen eines Werts erstellt.

Dynamische Eigenschaften können nicht auf Property-Instanzen zurückgreifen, um Überprüfungen durchzuführen, Standardwerte festzulegen oder eine automatische Logik auf Werte anzuwenden. Mit dynamischen Eigenschaften werden lediglich Werte der unterstützten Datenspeichertypen gespeichert. Weitere Informationen finden Sie unter Typen und Attributklassen.

Darüber hinaus kann bei dynamischen Eigenschaften im Gegensatz zu festen Eigenschaften kein anderer Name für das Klassenattribut und die Datenspeichereigenschaft verwendet werden. Siehe Nicht zulässige Eigenschaftsnamen.

Tipp: Wenn Sie einen dynamischen Attributwert mit einer Attributklasse validieren möchten, können Sie die Attributklasse instanziieren und die Methode validate() für den Wert aufrufen.

Mit einer abgeleiteten Expando-Klasse können feste Properties wie in einer Modellklasse definiert werden. Feste Expando-Eigenschaften zeigen ein ähnliches Verhalten wie die Eigenschaften eines Modells. Eine Expando-Instanz kann sowohl feste als auch dynamische Eigenschaften haben.

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.')

Die dynamischen (also nicht festen) Eigenschaften einer Expando-Instanz können gelöscht werden. Beim Löschen einer dynamischen Instanz wird das Attribut der Instanz von einer Anwendung gelöscht:

del crazy.last_minute_note

Konstruktor

Der Konstruktor der Expando-Klasse ist wie folgt definiert:

class Expando(parent=None, key_name=None, **kwds)

Eine Modellklasse, deren Eigenschaften vor Verwendung nicht in der Klasse definiert werden müssen. Wie beim Modell müssen für die Expando-Klasse abgeleitete Klassen definiert werden, um den Typ der Datenentitäten zu definieren.

Expando ist eine abgeleitete Klasse von Modell und übernimmt oder überschreibt vorhandene Methoden.

Argumente

parent
Die Modell- oder Schlüsselinstanz der Entität, die das übergeordnete Element der neuen Entität ist.
key_name

Der Name der neuen Entität. Der Name wird Teil des primären Schlüssels. Falls der Wert None ist, wird für den Schlüssel eine vom System generierte ID verwendet.

Der Wert für key_name darf nicht mit einer Ziffer beginnen und nicht in dieser Form vorliegen: __*__. Wenn Ihre Anwendung vom Nutzer gesendete Daten als Schlüsselnamen für Datenspeicherentitäten verwendet (beispielsweise eine E-Mail-Adresse), sollte die Anwendung zuerst den Wert bereinigen, beispielsweise durch Voranstellen eines bekannten Strings wie "key:", um diese Anforderungen zu erfüllen.

Ein key_name wird als Unicode-String gespeichert, wobei str-Werte in ASCII-Text konvertiert werden.

**kwds
Anfängliche Werte für die Attribute der Instanz als Keyword-Argumente. Jeder Name entspricht einem Attribut der neuen Instanz. Darüber hinaus kann jeder Name den festen Attributen entsprechen, die in der Expando-Klasse definiert sind. Es kann sich auch um dynamische Attribute handeln.