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?

2
Romz 8 Okt. 2012 im 02:24

3 Antworten

Beste Antwort

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.

2
Paul Collingwood 8 Okt. 2012 im 09:05

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...
1
Guido van Rossum 7 Okt. 2012 im 23:50

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.

0
dragonx 8 Okt. 2012 im 04:36