Modul google.appengine.ext.db.polymodel

Übersicht

Unterstützung für polymorphe Modelle und Abfragen.

Die Klasse "Model" allein kann nur funktionalen Polymorphismus unterstützen. Es ist möglich, eine abgeleitete Klasse von "Model" zu erstellen und dann von dieser Klasse für so viele Generationen wie nötig abgeleitete Klassen zu erstellen. Diese Klassen haben dann alle die gleichen Properties und Verhaltensweisen. Das Problem besteht darin, dass beim derartigen Erstellen von abgeleiteten Klassen von "Model" jede abgeleitete Klasse in ihrer eigenen Art abgelegt wird. Dies bedeutet, dass polymorphe Abfragen nicht möglich sind. Das Erstellen einer Abfrage für eine Basisklasse gibt nur Instanzen dieser Klasse aus dem Datenspeicher zurück, während Abfragen für eine abgeleitete Klasse nur die entsprechenden Instanzen zurückgeben.

Mit diesem Modul können Anwendungen Klassenhierarchien angeben, die polymorphe Abfragen unterstützen.

Inhalt

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

Basis: google.appengine.ext.db.Model

Basisklasse für Modelle, die polymorphe Abfragen unterstützt.

Verwenden Sie diese Klasse zum Erstellen von Hierarchien, die basierend auf ihren Typen abgefragt werden können.

Beispiel

Sehen Sie sich folgende Modellhierarchie an:

Animal

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

|

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

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

Diese Klassenhierarchie hat drei Ebenen. Das erste ist die "Stammklasse". Alle Modelle in einer Klassenhierarchie müssen Daten von diesem Stammverzeichnis übernehmen. Alle Modelle in der Hierarchie werden als die gleiche Art wie die Stammklasse gespeichert. "Panther"-Entitäten, die im Datenspeicher gespeichert sind, haben beispielsweise die Art "Tier". Bei der Abfrage der Art "Tier" werden beispielsweise Katzen und Hunde abgerufen, die Ihrer Abfrage entsprechen. Verschiedene Klassen, die in der Art der Stammklasse gespeichert sind, werden durch ihren Klassenschlüssel identifiziert. Beim Laden aus dem Datenspeicher wird er der entsprechenden Implementierungsklasse zugeordnet.

Polymorphe Properties:

Properties, die in einer gegebenen Basisklasse innerhalb einer Hierarchie definiert sind, werden im Datenspeicher nur für alle abgeleiteten Klassen gespeichert. Wenn also die Klasse "Feline" eine Property namens "whiskers" hätte, würden die Entitäten "Cat" und "Panther" auch "whiskers" haben, aber nicht "Animal", "Canine", "Dog" oder "Wolf".

Polymorphe Abfragen:

Wenn polymorphe Objekte in den Datenspeicher geschrieben werden, haben alle automatisch eine Property namens "class", die Sie abfragen können. Mithilfe dieser Property können Sie problemlos eine GQL-Abfrage für jede Unterhierarchie schreiben. Wenn Sie beispielsweise nur Objekte von Typ "Canine", einschließlich aller Objekte vom Typ "Dog" und "Wolf", abrufen möchten, sieht die Abfrage so aus:

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

Alternativ können Sie die Methoden "all" oder "gql" der Klasse "Canine" verwenden:

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

Die Property "class" sollte von Ihrem Code nur für Abfragen verwendet werden. Da sie die echte Python-Klasse darstellen soll, ist nicht vorgesehen, dass sie angezeigt wird.

Stammklasse:

Die Stammklasse ist die Klasse, von der alle anderen Klassen der Hierarchie Einstellungen übernehmen. Jede Hierarchie hat eine einzelne Stammklasse. Eine Klasse ist eine Stammklasse, wenn sie eine direkte untergeordnete Klasse von "PolyModel" ist. Die von der Stammklasse abgeleiteten Klassen sind alle von derselben Art wie die Stammklasse. Dies bedeutet:

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

Klassenmethode all(**kwds)Quelle

Ruft alle Instanzen einer Klassenhierarchie ab.

Parameter

kwds – Schlüsselwortparameter, die an "Model.all" übergeben werden.

Gibt Folgendes zurück:

Abfrage mit Filter, der dem Diskriminator dieser Klasse entspricht.

Klassenmethode class_key()Quelle

Berechnet den Klassenschlüssel für diese Klasse.

Gibt Folgendes zurück:

Klassenschlüssel für die Klasse. Standardmäßig ist dies die Liste der Hierarchieklassen, die bei der Stammklasse beginnt und nach unten zu "cls" verläuft.

Klassenmethode class_name()Quelle

Berechnet den Klassennamen für diese Klasse.

Gibt den Namen zurück, der für jedes Klassenelement in seinem Klassenschlüssel zu verwenden ist. Wird verwendet, um zwischen verschiedenen Klassen in der Datenspeicherart einer Klassenhierarchie zu unterscheiden.

Diese Methode ermöglicht Entwicklern, einen anderen Klassennamen im Datenspeicher als im Python-Code zu verwenden. Dies ist beispielsweise nützlich, wenn Sie Klassen umbenennen möchten, ohne bereits in den Datenspeicher geschriebene Instanzen migrieren zu müssen. Zum Umbenennen der polymorphen Klasse "Contact" in "SimpleContact" könnten Sie beispielsweise Folgendes konvertieren:

# Klassenschlüssel ist [‘Information’] class Information(PolyModel): …

# Klassenschlüssel ist [‘Information’, ‘Contact’] class Contact(Information): …

in:

# Klassenschlüssel ist weiterhin [‘Information’, ‘Contact’] class SimpleContact(Information):

… @classmethod def class_name(cls):

return ‘Contact’

# Klassenschlüssel ist [‘Information’, ‘Contact’, ‘ExtendedContact’] class ExtendedContact(SimpleContact): …

Damit wäre gewährleistet, dass alle zuvor mit dem alten Klassennamen geschriebenen Objekte weiterhin geladen würden.

Gibt Folgendes zurück:

Name dieser Klasse.

Klassenmethode from_entity(entity)Quelle

Lädt aus der Entität in die Klasse basierend auf dem Diskriminator.

Anstatt eine neue Instanz von "Model" auf Basis der Artzuordnung zu instanziieren, erstellt dies eine Instanz der korrekten Modellklasse basierend auf dem Klassenschlüssel der Entität.

Parameter

entity – Entität, die direkt aus dem Datenspeicher geladen wird.

Löst Folgendes aus:

"KindError", wenn keine Klassenzuordnung auf Basis des Diskriminators vorhanden ist.

Klassenmethode gql(query_string, *args, **kwds)Quelle

Gibt eine polymorphe Abfrage mithilfe des GQL-Abfragestrings zurück.

Diese Abfrage ist insofern polymorph, als ihre Filter so konfiguriert sind, dass Instanzen des Modells oder eine Instanz einer abgeleiteten Klasse des Modells abgerufen werden.

Parameter
  • query_string – Richtig formatierter GQL-Abfragestring ohne den Teil "SELECT * FROM <Entity>".

  • *args – Rest der Positionsargumente, die zum Binden von numerischen Referenzen in der Abfrage verwendet werden.

  • **kwds – Wörterbuchbasierte Argumente (für benannte Parameter).

classmethod kind()source

Ruft die Art eines polymorphen Modells ab.

Überschrieben, sodass alle abgeleiteten Klassen von Stammklassen von derselben Art wie die Stammklassen sind.

Gibt Folgendes zurück:

Art der Entität, die in den Datenspeicher geschrieben werden soll.

Klasse google.appengine.ext.db.polymodel.PolymorphicClass(name, bases, dct)Quelle

Basis: google.appengine.ext.db.PropertiedClass

Metaklasse zum Initialisieren von "PolymorphicClasses".

Diese Klasse erweitert "PropertiedClass", um neuen polymorphen Klassen einige statische Attribute hinzuzufügen, die für ihre korrekte Funktionsweise erforderlich sind.