Nach Rückspiel von unbekannten Arten in NDB

Ich bin dabei, meinen ersten RESTful Web Service auf GAE und die Python 2.7 Laufzeit zu schreiben. Ich habe mit Guidos glänzendem neuen ndb API angefangen.

Allerdings bin ich mir nicht sicher, wie man einen bestimmten Fall ohne das implizite Back-Reference-Feature der ursprünglichen db API zu lösen. Wenn der User-Agent eine bestimmte Ressource anfordert und diese Ressourcen 1 Grad entfernt:

Host / api / kind / id? Tiefe = 2

Was ist der beste Weg, um eine verwandte Sammlung von Entitäten aus dem "Eins" in einer Eins-zu-Viele-Beziehung zu entdecken, da die Art der verwandten Entität in der Entwicklungszeit unbekannt ist?

  • Ich bin nicht in der Lage, eine Ersatzabfrage zu verwenden, wie in einer vorherigen SO-Anfrage aufgrund der letzteren Einschränkung beschrieben. Die Tatsache, dass mein Modell zur Laufzeit definierbar ist (und daher nicht hartcodiert ist) verhindert, dass ich eine Abfrage zum Filtern von Eigenschaften für passende Schlüssel verwende.

  • Ahnen und andere kindless Abfragen sind auch aufgrund der Datenspeicherbeschränkung, die mich daran hindert, auf einer Eigenschaft ohne die angegebene Art zu filtern.

Bisher war die einzige Idee, die ich hatte (jenseits der Rückkehr zum db api), eine Cross-Group-Transaktion zu verwenden, um meine eigene Referenz auf das "Eins" zu schreiben, entweder durch die Aktualisierung eines ndb.StringProperty (repeat = True) mit Alle verwandten Arten, wenn eine Entität einer neuen Art eingeführt wird oder einfach nur eine Liste von Schlüsseln auf der "Eins" ndb.KeyProperty (repeat = True) jedes Mal, wenn eine verwandte "viele" Entität in den Datenspeicher geschrieben wird.

Ich hoffe, dass jemand mehr erfahren als ich selbst einen besseren Ansatz vorschlagen kann.

Angesichts des Vorschlags von jmort253 werde ich versuchen, meine Frage mit einem konkreten Beispiel aus den docs zu ergänzen:

class Contact(ndb.Expando): """ The One """ # basic info name = ndb.StringProperty() birth_day = ndb.DateProperty() # If I were using db, a collection called 'phone_numbers' would be implicitly # created here. I could use this property to retrieve related phone numbers # when this entity was queried. Since NDB lacks this feature, the service # will neither have a reference to query nor the means to know the # relationship exists in the first place since it cannot be hard-coded. The # data model is extensible and user-defined at runtime; most relationships # will be described only in the data, and must be discoverable by the server. # In this case, when Contact is queried, I need a way to retrieve the # collection of phone numbers. # Company info. company_title = ndb.StringProperty() company_name = ndb.StringProperty() company_description = ndb.StringProperty() company_address = ndb.PostalAddressProperty() class PhoneNumber(ndb.Expando): """ The Many """ # no collection_name='phone_numbers' equivalent exists for the key property contact = ndb.KeyProperty(kind='Contact') number = ndb.PhoneNumberProperty() 

2 Solutions collect form web for “Nach Rückspiel von unbekannten Arten in NDB”

Interessante Frage! Also grundsätzlich willst du die Kontaktklasse anschauen und herausfinden, ob es eine andere Modellklasse gibt, die eine KeyProperty hat, die sie referenziert; In diesem Beispiel PhoneNumber (aber es könnte viele sein).

Ich denke, die Lösung ist, um Ihre Benutzer zu bitten, explizit diesen Link hinzufügen, wenn die PhoneNumber-Klasse erstellt wird.

Sie können dies für Ihre Benutzer einfach machen, indem Sie ihnen eine Unterklasse von KeyProperty geben, die sich darum kümmert; z.B

 class LinkedKeyProperty(ndb.KeyProperty): def _fix_up(self, cls, code_name): super(LinkedKeyProperty, self)._fix_up(cls, code_name) modelclass = ndb.Model._kind_map[self._kind] collection_name = '%s_ref_%s_to_%s' % (cls.__name__, code_name, modelclass.__name__) setattr(modelclass, collection_name, (cls, self)) 

Genau wie du den Namen für die Sammlung auswählst und den Wert zu speichern gibt es bis zu Ihnen; Setzen Sie einfach etwas da, das es Ihnen leicht macht, dem Link zurückzukehren. Das Beispiel würde ein neues Attribut auf Kontakt erstellen:

 Contact.PhoneNumber_ref_contact_to_Contact == (PhoneNumber, PhoneNumber.contact) 

[Bearbeitet, um den Code zu bearbeiten und ein Beispiel hinzuzufügen. :-)]

Sound wie ein guter Gebrauch Fall für ndb.StructuredProperty .

  • GAE Entity Group / Datenmodellierung für Konsistenz und Performance
  • Zuweisen eines Autors zu einer Entität während der Erstellung
  • Google App Engine versucht, auf dev Daten zuzugreifen
  • Appengine Filter Ungleichheit und Ordnung fehlschlägt
  • Teilweise aktualisieren App Engine Entity
  • Google App Engine-Datenspeicher: Umgang mit eventueller Konsistenz
  • "Zu viel Konkurrenz" beim Erstellen neuer Entität im DataStore
  • So aktualisieren Sie ein Schema des NDB-Modells
  • Wie fügt man Bulk-Daten in Google App Engine Datastore ein?
  • Wie kann ich zwei eindeutige, queriable Felder für ein GAE Datastore Data Model erstellen?
  • GAE-Entwicklungsserver behalte die Volltextsuchindizes nach dem Neustart?
  • Python ist die beste Programmiersprache der Welt.