Modul google.appengine.ext.ndb.polymodel

Übersicht

Polymorphe Modelle und Abfragen.

Die Standard-NDB-Modellklasse unterstützt nur den "funktionalen Polymorphismus". Das heißt, Sie können eine Unterklasse des Modells erstellen und von dieser dann eine Unterklasse erstellen. Dies ist so oft möglich wie nötig. Diese Klassen teilen alle dieselben Attribute und Verhaltensweisen ihrer Basisklassen. Durch das Ableiten von Klassen vom "Model" erhält jedoch jede abgeleitete Klasse einen eigenen Typ. Dies bedeutet, dass es nicht möglich ist, "polymorphe Abfragen" durchzuführen. Beim Erstellen einer Abfrage für eine Basisklasse werden nur Entitäten zurückgegeben, deren Typ mit dem Typ der jeweiligen Basisklasse übereinstimmt. Entitäten, die Instanzen einer Unterklasse dieser Basisklasse sind, werden ausgeschlossen.

Mit der hier definierten PolyModel-Klasse können Sie Klassenhierarchien erstellen, die polymorphe Abfragen unterstützen. Leiten Sie Klassen einfach von "PolyModel" statt von "Model" ab.

Inhalt

Klasse google.appengine.ext.ndb.polymodel.PolyModel(*args, **kwds)Quelle

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

Basisklasse für Klassenhierarchien, die polymorphe Abfragen unterstützen.

Erstellen Sie mit dieser Klasse Hierarchien, die anhand ihres Typs abgefragt werden können.

Beispiel

Erwägen Sie die folgende Modellhierarchie:

+------+
|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. Beispiel: "Panther"-Entitäten, die in Cloud Datastore gespeichert sind, haben die Art "Tier". Bei der Abfrage der Art "Tier" werden z. B. Katzen, Hunde und Canines abgerufen, die Ihrer Abfrage entsprechen. Verschiedene im Typ der Stammklasse gespeicherte Klassen werden durch ihren Klassenschlüssel identifiziert. Aus Cloud Datastore geladene Klassen werden der entsprechenden Implementierungsklasse zugeordnet.

Polymorphe Properties:

Properties, die in einer gegebenen Basisklasse innerhalb einer Hierarchie definiert sind, werden in Cloud Datastore 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 Cloud Datastore geschrieben werden, haben alle automatisch eine Property namens "class", die Sie abfragen können. Mithilfe dieser Property können Sie auf einfache Weise eine Abfrage für eine Unterhierarchie schreiben. Sie können beispielsweise nur Objekte vom Typ "Canine", einschließlich aller Objekte vom Typ "Dog" und "Wolf", abrufen:

Canine.query()

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. Bei Bedarf können Sie darauf jedoch als das Attribut "class_" zugreifen.

Stammklasse:

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

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

Property zum Speichern des Klassenschlüssels einer polymorphen Klasse.

Der Klassenschlüssel ist eine Liste von Strings, die die Position einer polymorphen Entität innerhalb ihrer Klassenhierarchie beschreiben. Diese Property wird automatisch berechnet. Beispiel:

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

Foo().class_ == ['Foo']
Bar().class_ == ['Foo', 'Bar']
Baz().class_ == ['Foo', 'Bar', 'Baz']