Ist es in irgendeiner Weise möglich, Entitäten mit einer der Eigenschaften ihrer Eltern in GAE abzufragen (was nicht funktioniert)?
class Car(db.Model):
title = db.StringProperty()
type = db.StringProperty()
class Part(db.Model):
title = db.StringProperty()
car = Car()
car.title = 'BMW X5'
car.type = 'SUV'
car.put()
part = Part(parent = car)
part.title = 'Left door'
part.put()
parts = Part.all()
parts.filter('parent.type ==', 'SUV') # this in particular
Ich habe über ReferenceProperty und Indexes gelesen, bin mir aber nicht sicher, was ich brauche.
Mit GAE kann ich ein übergeordnetes Element für die Entität Part festlegen. Benötige ich jedoch tatsächlich ein (Duplikat):
parent = db.ReferenceProperty(Car, required=True)
Das würde sich anfühlen, als würde man duplizieren, was das System bereits tut, da es einen Elternteil hat. Oder gibt es einen anderen Weg?
3 Antworten
Es ist keine Antwort auf Ihre Frage als solche, aber NDB bietet strukturierte Eigenschaften.
https://developers.google.com/appengine/docs/python/ndb/properties#structured
Sie können die Eigenschaften eines Modells strukturieren. Beispielsweise können Sie eine Modellklasse Contact definieren, die eine Liste von Adressen mit jeweils interner Struktur enthält.
Obwohl die Instanzen strukturierter Eigenschaften mit derselben Syntax wie für Modellklassen definiert werden, handelt es sich nicht um vollwertige Entitäten. Sie haben keine eigenen Schlüssel im Datenspeicher. Sie können nicht unabhängig von der Entität abgerufen werden, zu der sie gehören. Eine Anwendung kann jedoch die Werte ihrer einzelnen Felder abfragen.
Hier würde das Auto also Teile als strukturierte Eigenschaft enthalten. Ob dies in Ihrem Anwendungsfall möglich ist, hängt davon ab, wie Sie Ihre Daten strukturieren. Wenn Sie wissen möchten, aus welchen Teilen ein bestimmtes Auto besteht, ist dies sinnvoll. Wenn Sie globale Teile filtern möchten, unabhängig davon, zu welchem Auto sie gehören, können Sie dies trotzdem tun, aber Sie müssen dafür sorgen, dass sich die "Teile" in jedem Auto auch auf ein anderes Modell beziehen. Wenn Sie sehen, was ich meine (ich bin mir nicht sicher, ob ich das tue), da jedes Auto seine eigenen Teile enthält.
Das Hinzufügen des übergeordneten Elements als explizite Eigenschaft hilft nicht weiter.
Sie können es jedoch in zwei Teile aufteilen:
for suv in Car.all().filter('type', 'SUV'):
for part in Part.all(ancestor=suv):
...do something with part...
Wenn Sie die Eigenschaft eines anderen (übergeordneten) Objekts abfragen möchten, müssen Sie dieses Objekt zuerst abrufen.
Ich kann mir zwei Lösungen für Ihr Problem vorstellen:
Guidos Weg besteht darin, nach dem übergeordneten Element und dann nach dem Teil abzufragen. Auf diese Weise werden mehr Abfragen ausgegeben.
Die zweite Möglichkeit besteht darin, eine Kopie von parent.type in Ihrem Teil zu speichern. Die Nachteile sind, dass Sie doppelte Daten speichern (mehr Speicherplatz), und Sie müssen darauf achten, dass Ihre Daten in Teil und Daten in Auto übereinstimmen. Sie müssen jedoch nur eine Abfrage ausgeben.
Sie müssen herausfinden, welches für Sie besser funktioniert.
Verwandte Fragen
Neue Fragen
python
Python ist eine dynamisch typisierte Mehrzweck-Programmiersprache mit mehreren Paradigmen. Es wurde entwickelt, um schnell zu lernen, zu verstehen, zu verwenden und eine saubere und einheitliche Syntax durchzusetzen. Bitte beachten Sie, dass Python 2 ab dem 01.01.2020 offiziell nicht mehr unterstützt wird. Fügen Sie für versionenspezifische Python-Fragen das Tag [python-2.7] oder [python-3.x] hinzu. Wenn Sie eine Python-Variante (z. B. Jython, PyPy) oder eine Bibliothek (z. B. Pandas und NumPy) verwenden, fügen Sie diese bitte in die Tags ein.