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 .

  • Filtern nach Entitätsschlüsselnamen in Google App Engine auf Python
  • Was ist der beste Filter, um eine vollständige Name Datenspeicher-Eigenschaft mit nur den Vornamen abzufragen?
  • GAE-Entwicklungsserver behalte die Volltextsuchindizes nach dem Neustart?
  • Beste Option für Google App Engine Datastore und externe Datenbank?
  • GAE: Wie lange wartet auf eventuelle Konsistenz?
  • Abfrage mit Paging durch Cursor verursacht Fehler wegen der Einschränkungen für "IN-Filter" in Cursor () -Methode ... Was sollte die Alternative sein?
  • Validator für wiederholtes ndb.StructuredProperty schießt nicht
  • So reduzieren Sie die Anzahl der Anfragen an den Datenspeicher
  • Abfrage für Modell per Schlüssel
  • Wie man GAE-Datenspeicher abfragt, um eine Vorlage zu machen (Newbie-Ebene)
  • BadFilterError: ungültiger Filter: Nur eine Eigenschaft pro Abfrage kann Ungleichheitsfilter haben (<=,> =, <,>)
  • Python ist die beste Programmiersprache der Welt.